drm/amdgpu/dce11: add dce clock setting for ELM/BAF
[cascardo/linux.git] / drivers / gpu / drm / amd / amdgpu / gfx_v7_0.c
index 7732059..86657e3 100644 (file)
@@ -31,8 +31,6 @@
 #include "amdgpu_ucode.h"
 #include "clearstate_ci.h"
 
-#include "uvd/uvd_4_2_d.h"
-
 #include "dce/dce_8_0_d.h"
 #include "dce/dce_8_0_sh_mask.h"
 
@@ -1006,9 +1004,15 @@ out:
  */
 static void gfx_v7_0_tiling_mode_table_init(struct amdgpu_device *adev)
 {
-       const u32 num_tile_mode_states = 32;
-       const u32 num_secondary_tile_mode_states = 16;
-       u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
+       const u32 num_tile_mode_states =
+                       ARRAY_SIZE(adev->gfx.config.tile_mode_array);
+       const u32 num_secondary_tile_mode_states =
+                       ARRAY_SIZE(adev->gfx.config.macrotile_mode_array);
+       u32 reg_offset, split_equal_to_row_size;
+       uint32_t *tile, *macrotile;
+
+       tile = adev->gfx.config.tile_mode_array;
+       macrotile = adev->gfx.config.macrotile_mode_array;
 
        switch (adev->gfx.config.mem_row_size_in_kb) {
        case 1:
@@ -1023,832 +1027,531 @@ static void gfx_v7_0_tiling_mode_table_init(struct amdgpu_device *adev)
                break;
        }
 
+       for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+               tile[reg_offset] = 0;
+       for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+               macrotile[reg_offset] = 0;
+
        switch (adev->asic_type) {
        case CHIP_BONAIRE:
-               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 1:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 2:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 3:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 4:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 5:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 6:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 7:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-
-                       case 8:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16));
-                               break;
-                       case 9:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
-                               break;
-                       case 10:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 11:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 12:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 13:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
-                               break;
-                       case 14:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 15:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 16:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 17:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 18:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 19:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
-                               break;
-                       case 20:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 21:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 22:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 23:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 24:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 25:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 26:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 27:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
-                               break;
-                       case 28:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 29:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 30:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_TILE_MODE0 + reg_offset, gb_tile_moden);
-               }
-               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 1:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 2:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 3:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 4:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 5:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 6:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_4_BANK));
-                               break;
-                       case 8:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 9:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 10:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 11:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 12:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 13:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 14:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_4_BANK));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden);
-               }
+               tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[7] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16));
+               tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
+               tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[12] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
+               tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[17] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
+               tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[21] =  (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[23] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
+               tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[30] = (TILE_SPLIT(split_equal_to_row_size));
+
+               macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+               macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+
+               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+                       WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]);
+               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+                       if (reg_offset != 7)
+                               WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]);
                break;
        case CHIP_HAWAII:
-               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 1:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 2:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 3:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 4:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 5:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 6:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 7:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-
-                       case 8:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
-                               break;
-                       case 9:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
-                               break;
-                       case 10:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 11:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 12:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 13:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
-                               break;
-                       case 14:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 15:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 16:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 17:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 18:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 19:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING));
-                               break;
-                       case 20:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 21:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 22:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 23:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 24:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 25:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 26:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 27:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
-                               break;
-                       case 28:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 29:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 30:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_TILE_MODE0 + reg_offset, gb_tile_moden);
-               }
-               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 1:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 2:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 3:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 4:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 5:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_4_BANK));
-                               break;
-                       case 6:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_4_BANK));
-                               break;
-                       case 8:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 9:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 10:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 11:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 12:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 13:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 14:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                               NUM_BANKS(ADDR_SURF_4_BANK));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden);
-               }
+               tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
+               tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
+               tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
+               tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING));
+               tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
+               tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+
+               macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+               macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+               macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+
+               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+                       WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]);
+               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+                       if (reg_offset != 7)
+                               WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]);
                break;
        case CHIP_KABINI:
        case CHIP_KAVERI:
        case CHIP_MULLINS:
        default:
-               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 1:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 2:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 3:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 4:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 5:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
-                               break;
-                       case 6:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
-                                               TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 7:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-
-                       case 8:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
-                                               PIPE_CONFIG(ADDR_SURF_P2));
-                               break;
-                       case 9:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
-                               break;
-                       case 10:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 11:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 12:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 13:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
-                               break;
-                       case 14:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 15:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 16:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 17:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 18:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 19:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING));
-                               break;
-                       case 20:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 21:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 22:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 23:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       case 24:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 25:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 26:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
-                               break;
-                       case 27:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
-                               break;
-                       case 28:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
-                               break;
-                       case 29:
-                               gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
-                                               PIPE_CONFIG(ADDR_SURF_P2) |
-                                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
-                                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
-                               break;
-                       case 30:
-                               gb_tile_moden = (TILE_SPLIT(split_equal_to_row_size));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_TILE_MODE0 + reg_offset, gb_tile_moden);
-               }
-               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
-                       switch (reg_offset) {
-                       case 0:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 1:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 2:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 3:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 4:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 5:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 6:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       case 8:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 9:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 10:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 11:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 12:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 13:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
-                                               NUM_BANKS(ADDR_SURF_16_BANK));
-                               break;
-                       case 14:
-                               gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                               NUM_BANKS(ADDR_SURF_8_BANK));
-                               break;
-                       default:
-                               gb_tile_moden = 0;
-                               break;
-                       }
-                       adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden;
-                       WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden);
-               }
+               tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
+                          TILE_SPLIT(split_equal_to_row_size));
+               tile[7] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+                          PIPE_CONFIG(ADDR_SURF_P2));
+               tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                          PIPE_CONFIG(ADDR_SURF_P2) |
+                          MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
+               tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[12] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
+               tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[17] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING));
+               tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[23] = (TILE_SPLIT(split_equal_to_row_size));
+               tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
+               tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                           PIPE_CONFIG(ADDR_SURF_P2) |
+                           MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                           SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               tile[30] = (TILE_SPLIT(split_equal_to_row_size));
+
+               macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+               macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+               macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+
+               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+                       WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]);
+               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+                       if (reg_offset != 7)
+                               WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]);
                break;
        }
 }
@@ -1893,45 +1596,31 @@ void gfx_v7_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num)
  */
 static u32 gfx_v7_0_create_bitmask(u32 bit_width)
 {
-       u32 i, mask = 0;
-
-       for (i = 0; i < bit_width; i++) {
-               mask <<= 1;
-               mask |= 1;
-       }
-       return mask;
+       return (u32)((1ULL << bit_width) - 1);
 }
 
 /**
- * gfx_v7_0_get_rb_disabled - computes the mask of disabled RBs
+ * gfx_v7_0_get_rb_active_bitmap - computes the mask of enabled RBs
  *
  * @adev: amdgpu_device pointer
- * @max_rb_num: max RBs (render backends) for the asic
- * @se_num: number of SEs (shader engines) for the asic
- * @sh_per_se: number of SH blocks per SE for the asic
  *
- * Calculates the bitmask of disabled RBs (CIK).
- * Returns the disabled RB bitmask.
+ * Calculates the bitmask of enabled RBs (CIK).
+ * Returns the enabled RB bitmask.
  */
-static u32 gfx_v7_0_get_rb_disabled(struct amdgpu_device *adev,
-                                   u32 max_rb_num_per_se,
-                                   u32 sh_per_se)
+static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev)
 {
        u32 data, mask;
 
        data = RREG32(mmCC_RB_BACKEND_DISABLE);
-       if (data & 1)
-               data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
-       else
-               data = 0;
-
        data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE);
 
+       data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
        data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
 
-       mask = gfx_v7_0_create_bitmask(max_rb_num_per_se / sh_per_se);
+       mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_backends_per_se /
+                                      adev->gfx.config.max_sh_per_se);
 
-       return data & mask;
+       return (~data) & mask;
 }
 
 /**
@@ -1940,73 +1629,31 @@ static u32 gfx_v7_0_get_rb_disabled(struct amdgpu_device *adev,
  * @adev: amdgpu_device pointer
  * @se_num: number of SEs (shader engines) for the asic
  * @sh_per_se: number of SH blocks per SE for the asic
- * @max_rb_num: max RBs (render backends) for the asic
  *
  * Configures per-SE/SH RB registers (CIK).
  */
-static void gfx_v7_0_setup_rb(struct amdgpu_device *adev,
-                             u32 se_num, u32 sh_per_se,
-                             u32 max_rb_num_per_se)
+static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)
 {
        int i, j;
-       u32 data, mask;
-       u32 disabled_rbs = 0;
-       u32 enabled_rbs = 0;
+       u32 data;
+       u32 active_rbs = 0;
+       u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
+                                       adev->gfx.config.max_sh_per_se;
 
        mutex_lock(&adev->grbm_idx_mutex);
-       for (i = 0; i < se_num; i++) {
-               for (j = 0; j < sh_per_se; j++) {
+       for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
+               for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
                        gfx_v7_0_select_se_sh(adev, i, j);
-                       data = gfx_v7_0_get_rb_disabled(adev, max_rb_num_per_se, sh_per_se);
-                       if (adev->asic_type == CHIP_HAWAII)
-                               disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
-                       else
-                               disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
+                       data = gfx_v7_0_get_rb_active_bitmap(adev);
+                       active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
+                                              rb_bitmap_width_per_sh);
                }
        }
        gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
        mutex_unlock(&adev->grbm_idx_mutex);
 
-       mask = 1;
-       for (i = 0; i < max_rb_num_per_se * se_num; i++) {
-               if (!(disabled_rbs & mask))
-                       enabled_rbs |= mask;
-               mask <<= 1;
-       }
-
-       adev->gfx.config.backend_enable_mask = enabled_rbs;
-
-       mutex_lock(&adev->grbm_idx_mutex);
-       for (i = 0; i < se_num; i++) {
-               gfx_v7_0_select_se_sh(adev, i, 0xffffffff);
-               data = 0;
-               for (j = 0; j < sh_per_se; j++) {
-                       switch (enabled_rbs & 3) {
-                       case 0:
-                               if (j == 0)
-                                       data |= (RASTER_CONFIG_RB_MAP_3 <<
-                                               PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
-                               else
-                                       data |= (RASTER_CONFIG_RB_MAP_0 <<
-                                               PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
-                               break;
-                       case 1:
-                               data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
-                               break;
-                       case 2:
-                               data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
-                               break;
-                       case 3:
-                       default:
-                               data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
-                               break;
-                       }
-                       enabled_rbs >>= 2;
-               }
-               WREG32(mmPA_SC_RASTER_CONFIG, data);
-       }
-       gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
-       mutex_unlock(&adev->grbm_idx_mutex);
+       adev->gfx.config.backend_enable_mask = active_rbs;
+       adev->gfx.config.num_rbs = hweight32(active_rbs);
 }
 
 /**
@@ -2059,192 +1706,23 @@ static void gmc_v7_0_init_compute_vmid(struct amdgpu_device *adev)
  */
 static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
 {
-       u32 gb_addr_config;
-       u32 mc_shared_chmap, mc_arb_ramcfg;
-       u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
-       u32 sh_mem_cfg;
-       u32 tmp;
+       u32 tmp, sh_mem_cfg;
        int i;
 
-       switch (adev->asic_type) {
-       case CHIP_BONAIRE:
-               adev->gfx.config.max_shader_engines = 2;
-               adev->gfx.config.max_tile_pipes = 4;
-               adev->gfx.config.max_cu_per_sh = 7;
-               adev->gfx.config.max_sh_per_se = 1;
-               adev->gfx.config.max_backends_per_se = 2;
-               adev->gfx.config.max_texture_channel_caches = 4;
-               adev->gfx.config.max_gprs = 256;
-               adev->gfx.config.max_gs_threads = 32;
-               adev->gfx.config.max_hw_contexts = 8;
-
-               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
-               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
-               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
-               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
-               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
-               break;
-       case CHIP_HAWAII:
-               adev->gfx.config.max_shader_engines = 4;
-               adev->gfx.config.max_tile_pipes = 16;
-               adev->gfx.config.max_cu_per_sh = 11;
-               adev->gfx.config.max_sh_per_se = 1;
-               adev->gfx.config.max_backends_per_se = 4;
-               adev->gfx.config.max_texture_channel_caches = 16;
-               adev->gfx.config.max_gprs = 256;
-               adev->gfx.config.max_gs_threads = 32;
-               adev->gfx.config.max_hw_contexts = 8;
-
-               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
-               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
-               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
-               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
-               gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
-               break;
-       case CHIP_KAVERI:
-               adev->gfx.config.max_shader_engines = 1;
-               adev->gfx.config.max_tile_pipes = 4;
-               if ((adev->pdev->device == 0x1304) ||
-                   (adev->pdev->device == 0x1305) ||
-                   (adev->pdev->device == 0x130C) ||
-                   (adev->pdev->device == 0x130F) ||
-                   (adev->pdev->device == 0x1310) ||
-                   (adev->pdev->device == 0x1311) ||
-                   (adev->pdev->device == 0x131C)) {
-                       adev->gfx.config.max_cu_per_sh = 8;
-                       adev->gfx.config.max_backends_per_se = 2;
-               } else if ((adev->pdev->device == 0x1309) ||
-                          (adev->pdev->device == 0x130A) ||
-                          (adev->pdev->device == 0x130D) ||
-                          (adev->pdev->device == 0x1313) ||
-                          (adev->pdev->device == 0x131D)) {
-                       adev->gfx.config.max_cu_per_sh = 6;
-                       adev->gfx.config.max_backends_per_se = 2;
-               } else if ((adev->pdev->device == 0x1306) ||
-                          (adev->pdev->device == 0x1307) ||
-                          (adev->pdev->device == 0x130B) ||
-                          (adev->pdev->device == 0x130E) ||
-                          (adev->pdev->device == 0x1315) ||
-                          (adev->pdev->device == 0x131B)) {
-                       adev->gfx.config.max_cu_per_sh = 4;
-                       adev->gfx.config.max_backends_per_se = 1;
-               } else {
-                       adev->gfx.config.max_cu_per_sh = 3;
-                       adev->gfx.config.max_backends_per_se = 1;
-               }
-               adev->gfx.config.max_sh_per_se = 1;
-               adev->gfx.config.max_texture_channel_caches = 4;
-               adev->gfx.config.max_gprs = 256;
-               adev->gfx.config.max_gs_threads = 16;
-               adev->gfx.config.max_hw_contexts = 8;
-
-               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
-               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
-               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
-               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
-               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
-               break;
-       case CHIP_KABINI:
-       case CHIP_MULLINS:
-       default:
-               adev->gfx.config.max_shader_engines = 1;
-               adev->gfx.config.max_tile_pipes = 2;
-               adev->gfx.config.max_cu_per_sh = 2;
-               adev->gfx.config.max_sh_per_se = 1;
-               adev->gfx.config.max_backends_per_se = 1;
-               adev->gfx.config.max_texture_channel_caches = 2;
-               adev->gfx.config.max_gprs = 256;
-               adev->gfx.config.max_gs_threads = 16;
-               adev->gfx.config.max_hw_contexts = 8;
-
-               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
-               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
-               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
-               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
-               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
-               break;
-       }
-
        WREG32(mmGRBM_CNTL, (0xff << GRBM_CNTL__READ_TIMEOUT__SHIFT));
 
-       mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP);
-       adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG);
-       mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg;
-
-       adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
-       adev->gfx.config.mem_max_burst_length_bytes = 256;
-       if (adev->flags & AMD_IS_APU) {
-               /* Get memory bank mapping mode. */
-               tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING);
-               dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
-               dimm01_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
-
-               tmp = RREG32(mmMC_FUS_DRAM1_BANK_ADDR_MAPPING);
-               dimm10_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
-               dimm11_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
-
-               /* Validate settings in case only one DIMM installed. */
-               if ((dimm00_addr_map == 0) || (dimm00_addr_map == 3) || (dimm00_addr_map == 4) || (dimm00_addr_map > 12))
-                       dimm00_addr_map = 0;
-               if ((dimm01_addr_map == 0) || (dimm01_addr_map == 3) || (dimm01_addr_map == 4) || (dimm01_addr_map > 12))
-                       dimm01_addr_map = 0;
-               if ((dimm10_addr_map == 0) || (dimm10_addr_map == 3) || (dimm10_addr_map == 4) || (dimm10_addr_map > 12))
-                       dimm10_addr_map = 0;
-               if ((dimm11_addr_map == 0) || (dimm11_addr_map == 3) || (dimm11_addr_map == 4) || (dimm11_addr_map > 12))
-                       dimm11_addr_map = 0;
-
-               /* If DIMM Addr map is 8GB, ROW size should be 2KB. Otherwise 1KB. */
-               /* If ROW size(DIMM1) != ROW size(DMIMM0), ROW size should be larger one. */
-               if ((dimm00_addr_map == 11) || (dimm01_addr_map == 11) || (dimm10_addr_map == 11) || (dimm11_addr_map == 11))
-                       adev->gfx.config.mem_row_size_in_kb = 2;
-               else
-                       adev->gfx.config.mem_row_size_in_kb = 1;
-       } else {
-               tmp = (mc_arb_ramcfg & MC_ARB_RAMCFG__NOOFCOLS_MASK) >> MC_ARB_RAMCFG__NOOFCOLS__SHIFT;
-               adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
-               if (adev->gfx.config.mem_row_size_in_kb > 4)
-                       adev->gfx.config.mem_row_size_in_kb = 4;
-       }
-       /* XXX use MC settings? */
-       adev->gfx.config.shader_engine_tile_size = 32;
-       adev->gfx.config.num_gpus = 1;
-       adev->gfx.config.multi_gpu_tile_size = 64;
-
-       /* fix up row size */
-       gb_addr_config &= ~GB_ADDR_CONFIG__ROW_SIZE_MASK;
-       switch (adev->gfx.config.mem_row_size_in_kb) {
-       case 1:
-       default:
-               gb_addr_config |= (0 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
-               break;
-       case 2:
-               gb_addr_config |= (1 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
-               break;
-       case 4:
-               gb_addr_config |= (2 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
-               break;
-       }
-       adev->gfx.config.gb_addr_config = gb_addr_config;
-
-       WREG32(mmGB_ADDR_CONFIG, gb_addr_config);
-       WREG32(mmHDP_ADDR_CONFIG, gb_addr_config);
-       WREG32(mmDMIF_ADDR_CALC, gb_addr_config);
-       WREG32(mmSDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
-       WREG32(mmSDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
-       WREG32(mmUVD_UDEC_ADDR_CONFIG, gb_addr_config);
-       WREG32(mmUVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
-       WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
+       WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
+       WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
+       WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
 
        gfx_v7_0_tiling_mode_table_init(adev);
 
-       gfx_v7_0_setup_rb(adev, adev->gfx.config.max_shader_engines,
-                         adev->gfx.config.max_sh_per_se,
-                         adev->gfx.config.max_backends_per_se);
+       gfx_v7_0_setup_rb(adev);
 
        /* set HW defaults for 3D engine */
        WREG32(mmCP_MEQ_THRESHOLDS,
-                       (0x30 << CP_MEQ_THRESHOLDS__MEQ1_START__SHIFT) |
-                       (0x60 << CP_MEQ_THRESHOLDS__MEQ2_START__SHIFT));
+              (0x30 << CP_MEQ_THRESHOLDS__MEQ1_START__SHIFT) |
+              (0x60 << CP_MEQ_THRESHOLDS__MEQ2_START__SHIFT));
 
        mutex_lock(&adev->grbm_idx_mutex);
        /*
@@ -2255,7 +1733,7 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
 
        /* XXX SH_MEM regs */
        /* where to put LDS, scratch, GPUVM in FSA64 space */
-       sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, 
+       sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,
                                   SH_MEM_ALIGNMENT_MODE_UNALIGNED);
 
        mutex_lock(&adev->srbm_mutex);
@@ -2379,7 +1857,7 @@ static int gfx_v7_0_ring_test_ring(struct amdgpu_ring *ring)
                return r;
        }
        WREG32(scratch, 0xCAFEDEAD);
-       r = amdgpu_ring_lock(ring, 3);
+       r = amdgpu_ring_alloc(ring, 3);
        if (r) {
                DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring->idx, r);
                amdgpu_gfx_scratch_free(adev, scratch);
@@ -2388,7 +1866,7 @@ static int gfx_v7_0_ring_test_ring(struct amdgpu_ring *ring)
        amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
        amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
        amdgpu_ring_write(ring, 0xDEADBEEF);
-       amdgpu_ring_unlock_commit(ring);
+       amdgpu_ring_commit(ring);
 
        for (i = 0; i < adev->usec_timeout; i++) {
                tmp = RREG32(scratch);
@@ -2446,6 +1924,25 @@ static void gfx_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
        amdgpu_ring_write(ring, 0x20); /* poll interval */
 }
 
+/**
+ * gfx_v7_0_ring_emit_hdp_invalidate - emit an hdp invalidate on the cp
+ *
+ * @adev: amdgpu_device pointer
+ * @ridx: amdgpu ring index
+ *
+ * Emits an hdp invalidate on the cp.
+ */
+static void gfx_v7_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
+{
+       amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
+       amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
+                                WRITE_DATA_DST_SEL(0) |
+                                WR_CONFIRM));
+       amdgpu_ring_write(ring, mmHDP_DEBUG0);
+       amdgpu_ring_write(ring, 0);
+       amdgpu_ring_write(ring, 1);
+}
+
 /**
  * gfx_v7_0_ring_emit_fence_gfx - emit a fence on the gfx ring
  *
@@ -2516,36 +2013,6 @@ static void gfx_v7_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
        amdgpu_ring_write(ring, upper_32_bits(seq));
 }
 
-/**
- * gfx_v7_0_ring_emit_semaphore - emit a semaphore on the CP ring
- *
- * @ring: amdgpu ring buffer object
- * @semaphore: amdgpu semaphore object
- * @emit_wait: Is this a sempahore wait?
- *
- * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
- * from running ahead of semaphore waits.
- */
-static bool gfx_v7_0_ring_emit_semaphore(struct amdgpu_ring *ring,
-                                        struct amdgpu_semaphore *semaphore,
-                                        bool emit_wait)
-{
-       uint64_t addr = semaphore->gpu_addr;
-       unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
-
-       amdgpu_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
-       amdgpu_ring_write(ring, addr & 0xffffffff);
-       amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
-
-       if (emit_wait && (ring->type == AMDGPU_RING_TYPE_GFX)) {
-               /* Prevent the PFP from running ahead of the semaphore wait */
-               amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
-               amdgpu_ring_write(ring, 0x0);
-       }
-
-       return true;
-}
-
 /*
  * IB stuff
  */
@@ -2593,8 +2060,7 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        else
                header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw |
-               (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0);
+       control |= ib->length_dw | (ib->vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -2622,8 +2088,7 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
 
        header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw |
-                          (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0);
+       control |= ib->length_dw | (ib->vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -2661,7 +2126,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
        }
        WREG32(scratch, 0xCAFEDEAD);
        memset(&ib, 0, sizeof(ib));
-       r = amdgpu_ib_get(ring, NULL, 256, &ib);
+       r = amdgpu_ib_get(adev, NULL, 256, &ib);
        if (r) {
                DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
                goto err1;
@@ -2671,9 +2136,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[2] = 0xDEADBEEF;
        ib.length_dw = 3;
 
-       r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, &ib, 1, NULL,
-                                                AMDGPU_FENCE_OWNER_UNDEFINED,
-                                                &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
        if (r)
                goto err2;
 
@@ -2700,7 +2163,8 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
 
 err2:
        fence_put(f);
-       amdgpu_ib_free(adev, &ib);
+       amdgpu_ib_free(adev, &ib, NULL);
+       fence_put(f);
 err1:
        amdgpu_gfx_scratch_free(adev, scratch);
        return r;
@@ -2842,7 +2306,7 @@ static int gfx_v7_0_cp_gfx_start(struct amdgpu_device *adev)
 
        gfx_v7_0_cp_gfx_enable(adev, true);
 
-       r = amdgpu_ring_lock(ring, gfx_v7_0_get_csb_size(adev) + 8);
+       r = amdgpu_ring_alloc(ring, gfx_v7_0_get_csb_size(adev) + 8);
        if (r) {
                DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
                return r;
@@ -2911,7 +2375,7 @@ static int gfx_v7_0_cp_gfx_start(struct amdgpu_device *adev)
        amdgpu_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
        amdgpu_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
 
-       amdgpu_ring_unlock_commit(ring);
+       amdgpu_ring_commit(ring);
 
        return 0;
 }
@@ -2989,21 +2453,14 @@ static int gfx_v7_0_cp_gfx_resume(struct amdgpu_device *adev)
 
 static u32 gfx_v7_0_ring_get_rptr_gfx(struct amdgpu_ring *ring)
 {
-       u32 rptr;
-
-       rptr = ring->adev->wb.wb[ring->rptr_offs];
-
-       return rptr;
+       return ring->adev->wb.wb[ring->rptr_offs];
 }
 
 static u32 gfx_v7_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)
 {
        struct amdgpu_device *adev = ring->adev;
-       u32 wptr;
 
-       wptr = RREG32(mmCP_RB0_WPTR);
-
-       return wptr;
+       return RREG32(mmCP_RB0_WPTR);
 }
 
 static void gfx_v7_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
@@ -3016,21 +2473,13 @@ static void gfx_v7_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
 
 static u32 gfx_v7_0_ring_get_rptr_compute(struct amdgpu_ring *ring)
 {
-       u32 rptr;
-
-       rptr = ring->adev->wb.wb[ring->rptr_offs];
-
-       return rptr;
+       return ring->adev->wb.wb[ring->rptr_offs];
 }
 
 static u32 gfx_v7_0_ring_get_wptr_compute(struct amdgpu_ring *ring)
 {
-       u32 wptr;
-
        /* XXX check if swapping is necessary on BE */
-       wptr = ring->adev->wb.wb[ring->wptr_offs];
-
-       return wptr;
+       return ring->adev->wb.wb[ring->wptr_offs];
 }
 
 static void gfx_v7_0_ring_set_wptr_compute(struct amdgpu_ring *ring)
@@ -3125,21 +2574,6 @@ static int gfx_v7_0_cp_compute_load_microcode(struct amdgpu_device *adev)
        return 0;
 }
 
-/**
- * gfx_v7_0_cp_compute_start - start the compute queues
- *
- * @adev: amdgpu_device pointer
- *
- * Enable the compute queues.
- * Returns 0 for success, error for failure.
- */
-static int gfx_v7_0_cp_compute_start(struct amdgpu_device *adev)
-{
-       gfx_v7_0_cp_compute_enable(adev, true);
-
-       return 0;
-}
-
 /**
  * gfx_v7_0_cp_compute_fini - stop the compute queues
  *
@@ -3330,9 +2764,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev)
        u32 *buf;
        struct bonaire_mqd *mqd;
 
-       r = gfx_v7_0_cp_compute_start(adev);
-       if (r)
-               return r;
+       gfx_v7_0_cp_compute_enable(adev, true);
 
        /* fix up chicken bits */
        tmp = RREG32(mmCP_CPF_DEBUG);
@@ -3610,6 +3042,26 @@ static int gfx_v7_0_cp_resume(struct amdgpu_device *adev)
        return 0;
 }
 
+/**
+ * gfx_v7_0_ring_emit_vm_flush - cik vm flush using the CP
+ *
+ * @ring: the ring to emmit the commands to
+ *
+ * Sync the command pipeline with the PFP. E.g. wait for everything
+ * to be completed.
+ */
+static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
+{
+       int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
+       if (usepfp) {
+               /* synce CE with ME to prevent CE fetch CEIB before context switch done */
+               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
+               amdgpu_ring_write(ring, 0);
+               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
+               amdgpu_ring_write(ring, 0);
+       }
+}
+
 /*
  * vm
  * VMID 0 is the physical GPU addresses as used by the kernel.
@@ -3628,13 +3080,18 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
                                        unsigned vm_id, uint64_t pd_addr)
 {
        int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
-       if (usepfp) {
-               /* synce CE with ME to prevent CE fetch CEIB before context switch done */
-               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
-               amdgpu_ring_write(ring, 0);
-               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
-               amdgpu_ring_write(ring, 0);
-       }
+       uint32_t seq = ring->fence_drv.sync_seq;
+       uint64_t addr = ring->fence_drv.gpu_addr;
+
+       amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
+       amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
+                                WAIT_REG_MEM_FUNCTION(3) | /* equal */
+                                WAIT_REG_MEM_ENGINE(usepfp)));   /* pfp or me */
+       amdgpu_ring_write(ring, addr & 0xfffffffc);
+       amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
+       amdgpu_ring_write(ring, seq);
+       amdgpu_ring_write(ring, 0xffffffff);
+       amdgpu_ring_write(ring, 4); /* poll interval */
 
        amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
        amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
@@ -4395,28 +3852,19 @@ static void gfx_v7_0_enable_gfx_cgpg(struct amdgpu_device *adev,
        }
 }
 
-static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev,
-                                        u32 se, u32 sh)
+static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev)
 {
-       u32 mask = 0, tmp, tmp1;
-       int i;
-
-       gfx_v7_0_select_se_sh(adev, se, sh);
-       tmp = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
-       tmp1 = RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
-       gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
+       u32 data, mask;
 
-       tmp &= 0xffff0000;
+       data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
+       data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
 
-       tmp |= tmp1;
-       tmp >>= 16;
+       data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
+       data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
 
-       for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) {
-               mask <<= 1;
-               mask |= 1;
-       }
+       mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_cu_per_sh);
 
-       return (~tmp) & mask;
+       return (~data) & mask;
 }
 
 static void gfx_v7_0_init_ao_cu_mask(struct amdgpu_device *adev)
@@ -4754,6 +4202,172 @@ static int gfx_v7_0_late_init(void *handle)
        return 0;
 }
 
+static void gfx_v7_0_gpu_early_init(struct amdgpu_device *adev)
+{
+       u32 gb_addr_config;
+       u32 mc_shared_chmap, mc_arb_ramcfg;
+       u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
+       u32 tmp;
+
+       switch (adev->asic_type) {
+       case CHIP_BONAIRE:
+               adev->gfx.config.max_shader_engines = 2;
+               adev->gfx.config.max_tile_pipes = 4;
+               adev->gfx.config.max_cu_per_sh = 7;
+               adev->gfx.config.max_sh_per_se = 1;
+               adev->gfx.config.max_backends_per_se = 2;
+               adev->gfx.config.max_texture_channel_caches = 4;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 32;
+               adev->gfx.config.max_hw_contexts = 8;
+
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       case CHIP_HAWAII:
+               adev->gfx.config.max_shader_engines = 4;
+               adev->gfx.config.max_tile_pipes = 16;
+               adev->gfx.config.max_cu_per_sh = 11;
+               adev->gfx.config.max_sh_per_se = 1;
+               adev->gfx.config.max_backends_per_se = 4;
+               adev->gfx.config.max_texture_channel_caches = 16;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 32;
+               adev->gfx.config.max_hw_contexts = 8;
+
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       case CHIP_KAVERI:
+               adev->gfx.config.max_shader_engines = 1;
+               adev->gfx.config.max_tile_pipes = 4;
+               if ((adev->pdev->device == 0x1304) ||
+                   (adev->pdev->device == 0x1305) ||
+                   (adev->pdev->device == 0x130C) ||
+                   (adev->pdev->device == 0x130F) ||
+                   (adev->pdev->device == 0x1310) ||
+                   (adev->pdev->device == 0x1311) ||
+                   (adev->pdev->device == 0x131C)) {
+                       adev->gfx.config.max_cu_per_sh = 8;
+                       adev->gfx.config.max_backends_per_se = 2;
+               } else if ((adev->pdev->device == 0x1309) ||
+                          (adev->pdev->device == 0x130A) ||
+                          (adev->pdev->device == 0x130D) ||
+                          (adev->pdev->device == 0x1313) ||
+                          (adev->pdev->device == 0x131D)) {
+                       adev->gfx.config.max_cu_per_sh = 6;
+                       adev->gfx.config.max_backends_per_se = 2;
+               } else if ((adev->pdev->device == 0x1306) ||
+                          (adev->pdev->device == 0x1307) ||
+                          (adev->pdev->device == 0x130B) ||
+                          (adev->pdev->device == 0x130E) ||
+                          (adev->pdev->device == 0x1315) ||
+                          (adev->pdev->device == 0x131B)) {
+                       adev->gfx.config.max_cu_per_sh = 4;
+                       adev->gfx.config.max_backends_per_se = 1;
+               } else {
+                       adev->gfx.config.max_cu_per_sh = 3;
+                       adev->gfx.config.max_backends_per_se = 1;
+               }
+               adev->gfx.config.max_sh_per_se = 1;
+               adev->gfx.config.max_texture_channel_caches = 4;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 16;
+               adev->gfx.config.max_hw_contexts = 8;
+
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       case CHIP_KABINI:
+       case CHIP_MULLINS:
+       default:
+               adev->gfx.config.max_shader_engines = 1;
+               adev->gfx.config.max_tile_pipes = 2;
+               adev->gfx.config.max_cu_per_sh = 2;
+               adev->gfx.config.max_sh_per_se = 1;
+               adev->gfx.config.max_backends_per_se = 1;
+               adev->gfx.config.max_texture_channel_caches = 2;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 16;
+               adev->gfx.config.max_hw_contexts = 8;
+
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       }
+
+       mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP);
+       adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG);
+       mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg;
+
+       adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
+       adev->gfx.config.mem_max_burst_length_bytes = 256;
+       if (adev->flags & AMD_IS_APU) {
+               /* Get memory bank mapping mode. */
+               tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING);
+               dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
+               dimm01_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
+
+               tmp = RREG32(mmMC_FUS_DRAM1_BANK_ADDR_MAPPING);
+               dimm10_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
+               dimm11_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
+
+               /* Validate settings in case only one DIMM installed. */
+               if ((dimm00_addr_map == 0) || (dimm00_addr_map == 3) || (dimm00_addr_map == 4) || (dimm00_addr_map > 12))
+                       dimm00_addr_map = 0;
+               if ((dimm01_addr_map == 0) || (dimm01_addr_map == 3) || (dimm01_addr_map == 4) || (dimm01_addr_map > 12))
+                       dimm01_addr_map = 0;
+               if ((dimm10_addr_map == 0) || (dimm10_addr_map == 3) || (dimm10_addr_map == 4) || (dimm10_addr_map > 12))
+                       dimm10_addr_map = 0;
+               if ((dimm11_addr_map == 0) || (dimm11_addr_map == 3) || (dimm11_addr_map == 4) || (dimm11_addr_map > 12))
+                       dimm11_addr_map = 0;
+
+               /* If DIMM Addr map is 8GB, ROW size should be 2KB. Otherwise 1KB. */
+               /* If ROW size(DIMM1) != ROW size(DMIMM0), ROW size should be larger one. */
+               if ((dimm00_addr_map == 11) || (dimm01_addr_map == 11) || (dimm10_addr_map == 11) || (dimm11_addr_map == 11))
+                       adev->gfx.config.mem_row_size_in_kb = 2;
+               else
+                       adev->gfx.config.mem_row_size_in_kb = 1;
+       } else {
+               tmp = (mc_arb_ramcfg & MC_ARB_RAMCFG__NOOFCOLS_MASK) >> MC_ARB_RAMCFG__NOOFCOLS__SHIFT;
+               adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
+               if (adev->gfx.config.mem_row_size_in_kb > 4)
+                       adev->gfx.config.mem_row_size_in_kb = 4;
+       }
+       /* XXX use MC settings? */
+       adev->gfx.config.shader_engine_tile_size = 32;
+       adev->gfx.config.num_gpus = 1;
+       adev->gfx.config.multi_gpu_tile_size = 64;
+
+       /* fix up row size */
+       gb_addr_config &= ~GB_ADDR_CONFIG__ROW_SIZE_MASK;
+       switch (adev->gfx.config.mem_row_size_in_kb) {
+       case 1:
+       default:
+               gb_addr_config |= (0 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
+               break;
+       case 2:
+               gb_addr_config |= (1 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
+               break;
+       case 4:
+               gb_addr_config |= (2 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT);
+               break;
+       }
+       adev->gfx.config.gb_addr_config = gb_addr_config;
+}
+
 static int gfx_v7_0_sw_init(void *handle)
 {
        struct amdgpu_ring *ring;
@@ -4800,7 +4414,7 @@ static int gfx_v7_0_sw_init(void *handle)
                ring = &adev->gfx.gfx_ring[i];
                ring->ring_obj = NULL;
                sprintf(ring->name, "gfx");
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
                                     AMDGPU_RING_TYPE_GFX);
@@ -4824,10 +4438,10 @@ static int gfx_v7_0_sw_init(void *handle)
                ring->me = 1; /* first MEC */
                ring->pipe = i / 8;
                ring->queue = i % 8;
-               sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
+               sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
                irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
                /* type-2 packets are deprecated on MEC, use type-3 instead */
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, irq_type,
                                     AMDGPU_RING_TYPE_COMPUTE);
@@ -4857,6 +4471,10 @@ static int gfx_v7_0_sw_init(void *handle)
        if (r)
                return r;
 
+       adev->gfx.ce_ram_size = 0x8000;
+
+       gfx_v7_0_gpu_early_init(adev);
+
        return r;
 }
 
@@ -4897,8 +4515,6 @@ static int gfx_v7_0_hw_init(void *handle)
        if (r)
                return r;
 
-       adev->gfx.ce_ram_size = 0x8000;
-
        return r;
 }
 
@@ -5015,16 +4631,6 @@ static void gfx_v7_0_print_status(void *handle)
                 RREG32(mmHDP_ADDR_CONFIG));
        dev_info(adev->dev, "  DMIF_ADDR_CALC=0x%08X\n",
                 RREG32(mmDMIF_ADDR_CALC));
-       dev_info(adev->dev, "  SDMA0_TILING_CONFIG=0x%08X\n",
-                RREG32(mmSDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET));
-       dev_info(adev->dev, "  SDMA1_TILING_CONFIG=0x%08X\n",
-                RREG32(mmSDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
 
        dev_info(adev->dev, "  CP_MEQ_THRESHOLDS=0x%08X\n",
                 RREG32(mmCP_MEQ_THRESHOLDS));
@@ -5567,13 +5173,15 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
        .parse_cs = NULL,
        .emit_ib = gfx_v7_0_ring_emit_ib_gfx,
        .emit_fence = gfx_v7_0_ring_emit_fence_gfx,
-       .emit_semaphore = gfx_v7_0_ring_emit_semaphore,
+       .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v7_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v7_0_ring_test_ring,
        .test_ib = gfx_v7_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
+       .pad_ib = amdgpu_ring_generic_pad_ib,
 };
 
 static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
@@ -5583,13 +5191,15 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
        .parse_cs = NULL,
        .emit_ib = gfx_v7_0_ring_emit_ib_compute,
        .emit_fence = gfx_v7_0_ring_emit_fence_compute,
-       .emit_semaphore = gfx_v7_0_ring_emit_semaphore,
+       .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v7_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v7_0_ring_test_ring,
        .test_ib = gfx_v7_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
+       .pad_ib = amdgpu_ring_generic_pad_ib,
 };
 
 static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev)
@@ -5659,7 +5269,7 @@ static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev)
 
 
 int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
-                                                                  struct amdgpu_cu_info *cu_info)
+                        struct amdgpu_cu_info *cu_info)
 {
        int i, j, k, counter, active_cu_number = 0;
        u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
@@ -5667,16 +5277,19 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
        if (!adev || !cu_info)
                return -EINVAL;
 
+       memset(cu_info, 0, sizeof(*cu_info));
+
        mutex_lock(&adev->grbm_idx_mutex);
        for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
                for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
                        mask = 1;
                        ao_bitmap = 0;
                        counter = 0;
-                       bitmap = gfx_v7_0_get_cu_active_bitmap(adev, i, j);
+                       gfx_v7_0_select_se_sh(adev, i, j);
+                       bitmap = gfx_v7_0_get_cu_active_bitmap(adev);
                        cu_info->bitmap[i][j] = bitmap;
 
-                       for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {
+                       for (k = 0; k < 16; k ++) {
                                if (bitmap & mask) {
                                        if (counter < 2)
                                                ao_bitmap |= mask;
@@ -5688,9 +5301,11 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
                        ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
                }
        }
+       gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
+       mutex_unlock(&adev->grbm_idx_mutex);
 
        cu_info->number = active_cu_number;
        cu_info->ao_cu_mask = ao_cu_mask;
-       mutex_unlock(&adev->grbm_idx_mutex);
+
        return 0;
 }