root/drivers/gpu/drm/radeon/si.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. si_init_golden_registers
  2. si_get_allowed_info_register
  3. si_get_xclk
  4. si_get_temp
  5. si_mc_load_microcode
  6. si_init_microcode
  7. dce6_line_buffer_adjust
  8. si_get_number_of_dram_channels
  9. dce6_dram_bandwidth
  10. dce6_dram_bandwidth_for_display
  11. dce6_data_return_bandwidth
  12. dce6_get_dmif_bytes_per_request
  13. dce6_dmif_request_bandwidth
  14. dce6_available_bandwidth
  15. dce6_average_bandwidth
  16. dce6_latency_watermark
  17. dce6_average_bandwidth_vs_dram_bandwidth_for_display
  18. dce6_average_bandwidth_vs_available_bandwidth
  19. dce6_check_latency_hiding
  20. dce6_program_watermarks
  21. dce6_bandwidth_update
  22. si_tiling_mode_table_init
  23. si_select_se_sh
  24. si_create_bitmask
  25. si_get_cu_enabled
  26. si_setup_spi
  27. si_get_rb_disabled
  28. si_setup_rb
  29. si_gpu_init
  30. si_scratch_init
  31. si_fence_ring_emit
  32. si_ring_ib_execute
  33. si_cp_enable
  34. si_cp_load_microcode
  35. si_cp_start
  36. si_cp_fini
  37. si_cp_resume
  38. si_gpu_check_soft_reset
  39. si_gpu_soft_reset
  40. si_set_clk_bypass_mode
  41. si_spll_powerdown
  42. si_gpu_pci_config_reset
  43. si_asic_reset
  44. si_gfx_is_lockup
  45. si_mc_program
  46. si_vram_gtt_location
  47. si_mc_init
  48. si_pcie_gart_tlb_flush
  49. si_pcie_gart_enable
  50. si_pcie_gart_disable
  51. si_pcie_gart_fini
  52. si_vm_reg_valid
  53. si_vm_packet3_ce_check
  54. si_vm_packet3_cp_dma_check
  55. si_vm_packet3_gfx_check
  56. si_vm_packet3_compute_check
  57. si_ib_parse
  58. si_vm_init
  59. si_vm_fini
  60. si_vm_decode_fault
  61. si_vm_flush
  62. si_wait_for_rlc_serdes
  63. si_enable_gui_idle_interrupt
  64. si_set_uvd_dcm
  65. si_init_uvd_internal_cg
  66. si_halt_rlc
  67. si_update_rlc
  68. si_enable_dma_pg
  69. si_init_dma_pg
  70. si_enable_gfx_cgpg
  71. si_init_gfx_cgpg
  72. si_get_cu_active_bitmap
  73. si_init_ao_cu_mask
  74. si_enable_cgcg
  75. si_enable_mgcg
  76. si_enable_uvd_mgcg
  77. si_enable_mc_ls
  78. si_enable_mc_mgcg
  79. si_enable_dma_mgcg
  80. si_enable_bif_mgls
  81. si_enable_hdp_mgcg
  82. si_enable_hdp_ls
  83. si_update_cg
  84. si_init_cg
  85. si_fini_cg
  86. si_get_csb_size
  87. si_get_csb_buffer
  88. si_init_pg
  89. si_fini_pg
  90. si_rlc_reset
  91. si_rlc_stop
  92. si_rlc_start
  93. si_lbpw_supported
  94. si_enable_lbpw
  95. si_rlc_resume
  96. si_enable_interrupts
  97. si_disable_interrupts
  98. si_disable_interrupt_state
  99. si_irq_init
  100. si_irq_set
  101. si_irq_ack
  102. si_irq_disable
  103. si_irq_suspend
  104. si_irq_fini
  105. si_get_ih_wptr
  106. si_irq_process
  107. si_uvd_init
  108. si_uvd_start
  109. si_uvd_resume
  110. si_vce_init
  111. si_vce_start
  112. si_vce_resume
  113. si_startup
  114. si_resume
  115. si_suspend
  116. si_init
  117. si_fini
  118. si_get_gpu_clock_counter
  119. si_set_uvd_clocks
  120. si_pcie_gen3_enable
  121. si_program_aspm
  122. si_vce_send_vcepll_ctlreq
  123. si_set_vce_clocks

   1 /*
   2  * Copyright 2011 Advanced Micro Devices, Inc.
   3  *
   4  * Permission is hereby granted, free of charge, to any person obtaining a
   5  * copy of this software and associated documentation files (the "Software"),
   6  * to deal in the Software without restriction, including without limitation
   7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8  * and/or sell copies of the Software, and to permit persons to whom the
   9  * Software is furnished to do so, subject to the following conditions:
  10  *
  11  * The above copyright notice and this permission notice shall be included in
  12  * all copies or substantial portions of the Software.
  13  *
  14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20  * OTHER DEALINGS IN THE SOFTWARE.
  21  *
  22  * Authors: Alex Deucher
  23  */
  24 
  25 #include <linux/firmware.h>
  26 #include <linux/slab.h>
  27 #include <linux/module.h>
  28 
  29 #include <drm/drm_pci.h>
  30 #include <drm/drm_vblank.h>
  31 #include <drm/radeon_drm.h>
  32 
  33 #include "atom.h"
  34 #include "clearstate_si.h"
  35 #include "radeon.h"
  36 #include "radeon_asic.h"
  37 #include "radeon_audio.h"
  38 #include "radeon_ucode.h"
  39 #include "si_blit_shaders.h"
  40 #include "sid.h"
  41 
  42 
  43 MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
  44 MODULE_FIRMWARE("radeon/TAHITI_me.bin");
  45 MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
  46 MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
  47 MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
  48 MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
  49 MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
  50 
  51 MODULE_FIRMWARE("radeon/tahiti_pfp.bin");
  52 MODULE_FIRMWARE("radeon/tahiti_me.bin");
  53 MODULE_FIRMWARE("radeon/tahiti_ce.bin");
  54 MODULE_FIRMWARE("radeon/tahiti_mc.bin");
  55 MODULE_FIRMWARE("radeon/tahiti_rlc.bin");
  56 MODULE_FIRMWARE("radeon/tahiti_smc.bin");
  57 
  58 MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
  59 MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
  60 MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
  61 MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
  62 MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
  63 MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
  64 MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
  65 
  66 MODULE_FIRMWARE("radeon/pitcairn_pfp.bin");
  67 MODULE_FIRMWARE("radeon/pitcairn_me.bin");
  68 MODULE_FIRMWARE("radeon/pitcairn_ce.bin");
  69 MODULE_FIRMWARE("radeon/pitcairn_mc.bin");
  70 MODULE_FIRMWARE("radeon/pitcairn_rlc.bin");
  71 MODULE_FIRMWARE("radeon/pitcairn_smc.bin");
  72 MODULE_FIRMWARE("radeon/pitcairn_k_smc.bin");
  73 
  74 MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
  75 MODULE_FIRMWARE("radeon/VERDE_me.bin");
  76 MODULE_FIRMWARE("radeon/VERDE_ce.bin");
  77 MODULE_FIRMWARE("radeon/VERDE_mc.bin");
  78 MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
  79 MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
  80 MODULE_FIRMWARE("radeon/VERDE_smc.bin");
  81 
  82 MODULE_FIRMWARE("radeon/verde_pfp.bin");
  83 MODULE_FIRMWARE("radeon/verde_me.bin");
  84 MODULE_FIRMWARE("radeon/verde_ce.bin");
  85 MODULE_FIRMWARE("radeon/verde_mc.bin");
  86 MODULE_FIRMWARE("radeon/verde_rlc.bin");
  87 MODULE_FIRMWARE("radeon/verde_smc.bin");
  88 MODULE_FIRMWARE("radeon/verde_k_smc.bin");
  89 
  90 MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
  91 MODULE_FIRMWARE("radeon/OLAND_me.bin");
  92 MODULE_FIRMWARE("radeon/OLAND_ce.bin");
  93 MODULE_FIRMWARE("radeon/OLAND_mc.bin");
  94 MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
  95 MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
  96 MODULE_FIRMWARE("radeon/OLAND_smc.bin");
  97 
  98 MODULE_FIRMWARE("radeon/oland_pfp.bin");
  99 MODULE_FIRMWARE("radeon/oland_me.bin");
 100 MODULE_FIRMWARE("radeon/oland_ce.bin");
 101 MODULE_FIRMWARE("radeon/oland_mc.bin");
 102 MODULE_FIRMWARE("radeon/oland_rlc.bin");
 103 MODULE_FIRMWARE("radeon/oland_smc.bin");
 104 MODULE_FIRMWARE("radeon/oland_k_smc.bin");
 105 
 106 MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
 107 MODULE_FIRMWARE("radeon/HAINAN_me.bin");
 108 MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
 109 MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
 110 MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
 111 MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
 112 MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
 113 
 114 MODULE_FIRMWARE("radeon/hainan_pfp.bin");
 115 MODULE_FIRMWARE("radeon/hainan_me.bin");
 116 MODULE_FIRMWARE("radeon/hainan_ce.bin");
 117 MODULE_FIRMWARE("radeon/hainan_mc.bin");
 118 MODULE_FIRMWARE("radeon/hainan_rlc.bin");
 119 MODULE_FIRMWARE("radeon/hainan_smc.bin");
 120 MODULE_FIRMWARE("radeon/hainan_k_smc.bin");
 121 MODULE_FIRMWARE("radeon/banks_k_2_smc.bin");
 122 
 123 MODULE_FIRMWARE("radeon/si58_mc.bin");
 124 
 125 static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
 126 static void si_pcie_gen3_enable(struct radeon_device *rdev);
 127 static void si_program_aspm(struct radeon_device *rdev);
 128 extern void sumo_rlc_fini(struct radeon_device *rdev);
 129 extern int sumo_rlc_init(struct radeon_device *rdev);
 130 extern int r600_ih_ring_alloc(struct radeon_device *rdev);
 131 extern void r600_ih_ring_fini(struct radeon_device *rdev);
 132 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
 133 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
 134 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
 135 extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
 136 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
 137 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
 138 static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
 139                                          bool enable);
 140 static void si_init_pg(struct radeon_device *rdev);
 141 static void si_init_cg(struct radeon_device *rdev);
 142 static void si_fini_pg(struct radeon_device *rdev);
 143 static void si_fini_cg(struct radeon_device *rdev);
 144 static void si_rlc_stop(struct radeon_device *rdev);
 145 
 146 static const u32 crtc_offsets[] =
 147 {
 148         EVERGREEN_CRTC0_REGISTER_OFFSET,
 149         EVERGREEN_CRTC1_REGISTER_OFFSET,
 150         EVERGREEN_CRTC2_REGISTER_OFFSET,
 151         EVERGREEN_CRTC3_REGISTER_OFFSET,
 152         EVERGREEN_CRTC4_REGISTER_OFFSET,
 153         EVERGREEN_CRTC5_REGISTER_OFFSET
 154 };
 155 
 156 static const u32 si_disp_int_status[] =
 157 {
 158         DISP_INTERRUPT_STATUS,
 159         DISP_INTERRUPT_STATUS_CONTINUE,
 160         DISP_INTERRUPT_STATUS_CONTINUE2,
 161         DISP_INTERRUPT_STATUS_CONTINUE3,
 162         DISP_INTERRUPT_STATUS_CONTINUE4,
 163         DISP_INTERRUPT_STATUS_CONTINUE5
 164 };
 165 
 166 #define DC_HPDx_CONTROL(x)        (DC_HPD1_CONTROL     + (x * 0xc))
 167 #define DC_HPDx_INT_CONTROL(x)    (DC_HPD1_INT_CONTROL + (x * 0xc))
 168 #define DC_HPDx_INT_STATUS_REG(x) (DC_HPD1_INT_STATUS  + (x * 0xc))
 169 
 170 static const u32 verde_rlc_save_restore_register_list[] =
 171 {
 172         (0x8000 << 16) | (0x98f4 >> 2),
 173         0x00000000,
 174         (0x8040 << 16) | (0x98f4 >> 2),
 175         0x00000000,
 176         (0x8000 << 16) | (0xe80 >> 2),
 177         0x00000000,
 178         (0x8040 << 16) | (0xe80 >> 2),
 179         0x00000000,
 180         (0x8000 << 16) | (0x89bc >> 2),
 181         0x00000000,
 182         (0x8040 << 16) | (0x89bc >> 2),
 183         0x00000000,
 184         (0x8000 << 16) | (0x8c1c >> 2),
 185         0x00000000,
 186         (0x8040 << 16) | (0x8c1c >> 2),
 187         0x00000000,
 188         (0x9c00 << 16) | (0x98f0 >> 2),
 189         0x00000000,
 190         (0x9c00 << 16) | (0xe7c >> 2),
 191         0x00000000,
 192         (0x8000 << 16) | (0x9148 >> 2),
 193         0x00000000,
 194         (0x8040 << 16) | (0x9148 >> 2),
 195         0x00000000,
 196         (0x9c00 << 16) | (0x9150 >> 2),
 197         0x00000000,
 198         (0x9c00 << 16) | (0x897c >> 2),
 199         0x00000000,
 200         (0x9c00 << 16) | (0x8d8c >> 2),
 201         0x00000000,
 202         (0x9c00 << 16) | (0xac54 >> 2),
 203         0X00000000,
 204         0x3,
 205         (0x9c00 << 16) | (0x98f8 >> 2),
 206         0x00000000,
 207         (0x9c00 << 16) | (0x9910 >> 2),
 208         0x00000000,
 209         (0x9c00 << 16) | (0x9914 >> 2),
 210         0x00000000,
 211         (0x9c00 << 16) | (0x9918 >> 2),
 212         0x00000000,
 213         (0x9c00 << 16) | (0x991c >> 2),
 214         0x00000000,
 215         (0x9c00 << 16) | (0x9920 >> 2),
 216         0x00000000,
 217         (0x9c00 << 16) | (0x9924 >> 2),
 218         0x00000000,
 219         (0x9c00 << 16) | (0x9928 >> 2),
 220         0x00000000,
 221         (0x9c00 << 16) | (0x992c >> 2),
 222         0x00000000,
 223         (0x9c00 << 16) | (0x9930 >> 2),
 224         0x00000000,
 225         (0x9c00 << 16) | (0x9934 >> 2),
 226         0x00000000,
 227         (0x9c00 << 16) | (0x9938 >> 2),
 228         0x00000000,
 229         (0x9c00 << 16) | (0x993c >> 2),
 230         0x00000000,
 231         (0x9c00 << 16) | (0x9940 >> 2),
 232         0x00000000,
 233         (0x9c00 << 16) | (0x9944 >> 2),
 234         0x00000000,
 235         (0x9c00 << 16) | (0x9948 >> 2),
 236         0x00000000,
 237         (0x9c00 << 16) | (0x994c >> 2),
 238         0x00000000,
 239         (0x9c00 << 16) | (0x9950 >> 2),
 240         0x00000000,
 241         (0x9c00 << 16) | (0x9954 >> 2),
 242         0x00000000,
 243         (0x9c00 << 16) | (0x9958 >> 2),
 244         0x00000000,
 245         (0x9c00 << 16) | (0x995c >> 2),
 246         0x00000000,
 247         (0x9c00 << 16) | (0x9960 >> 2),
 248         0x00000000,
 249         (0x9c00 << 16) | (0x9964 >> 2),
 250         0x00000000,
 251         (0x9c00 << 16) | (0x9968 >> 2),
 252         0x00000000,
 253         (0x9c00 << 16) | (0x996c >> 2),
 254         0x00000000,
 255         (0x9c00 << 16) | (0x9970 >> 2),
 256         0x00000000,
 257         (0x9c00 << 16) | (0x9974 >> 2),
 258         0x00000000,
 259         (0x9c00 << 16) | (0x9978 >> 2),
 260         0x00000000,
 261         (0x9c00 << 16) | (0x997c >> 2),
 262         0x00000000,
 263         (0x9c00 << 16) | (0x9980 >> 2),
 264         0x00000000,
 265         (0x9c00 << 16) | (0x9984 >> 2),
 266         0x00000000,
 267         (0x9c00 << 16) | (0x9988 >> 2),
 268         0x00000000,
 269         (0x9c00 << 16) | (0x998c >> 2),
 270         0x00000000,
 271         (0x9c00 << 16) | (0x8c00 >> 2),
 272         0x00000000,
 273         (0x9c00 << 16) | (0x8c14 >> 2),
 274         0x00000000,
 275         (0x9c00 << 16) | (0x8c04 >> 2),
 276         0x00000000,
 277         (0x9c00 << 16) | (0x8c08 >> 2),
 278         0x00000000,
 279         (0x8000 << 16) | (0x9b7c >> 2),
 280         0x00000000,
 281         (0x8040 << 16) | (0x9b7c >> 2),
 282         0x00000000,
 283         (0x8000 << 16) | (0xe84 >> 2),
 284         0x00000000,
 285         (0x8040 << 16) | (0xe84 >> 2),
 286         0x00000000,
 287         (0x8000 << 16) | (0x89c0 >> 2),
 288         0x00000000,
 289         (0x8040 << 16) | (0x89c0 >> 2),
 290         0x00000000,
 291         (0x8000 << 16) | (0x914c >> 2),
 292         0x00000000,
 293         (0x8040 << 16) | (0x914c >> 2),
 294         0x00000000,
 295         (0x8000 << 16) | (0x8c20 >> 2),
 296         0x00000000,
 297         (0x8040 << 16) | (0x8c20 >> 2),
 298         0x00000000,
 299         (0x8000 << 16) | (0x9354 >> 2),
 300         0x00000000,
 301         (0x8040 << 16) | (0x9354 >> 2),
 302         0x00000000,
 303         (0x9c00 << 16) | (0x9060 >> 2),
 304         0x00000000,
 305         (0x9c00 << 16) | (0x9364 >> 2),
 306         0x00000000,
 307         (0x9c00 << 16) | (0x9100 >> 2),
 308         0x00000000,
 309         (0x9c00 << 16) | (0x913c >> 2),
 310         0x00000000,
 311         (0x8000 << 16) | (0x90e0 >> 2),
 312         0x00000000,
 313         (0x8000 << 16) | (0x90e4 >> 2),
 314         0x00000000,
 315         (0x8000 << 16) | (0x90e8 >> 2),
 316         0x00000000,
 317         (0x8040 << 16) | (0x90e0 >> 2),
 318         0x00000000,
 319         (0x8040 << 16) | (0x90e4 >> 2),
 320         0x00000000,
 321         (0x8040 << 16) | (0x90e8 >> 2),
 322         0x00000000,
 323         (0x9c00 << 16) | (0x8bcc >> 2),
 324         0x00000000,
 325         (0x9c00 << 16) | (0x8b24 >> 2),
 326         0x00000000,
 327         (0x9c00 << 16) | (0x88c4 >> 2),
 328         0x00000000,
 329         (0x9c00 << 16) | (0x8e50 >> 2),
 330         0x00000000,
 331         (0x9c00 << 16) | (0x8c0c >> 2),
 332         0x00000000,
 333         (0x9c00 << 16) | (0x8e58 >> 2),
 334         0x00000000,
 335         (0x9c00 << 16) | (0x8e5c >> 2),
 336         0x00000000,
 337         (0x9c00 << 16) | (0x9508 >> 2),
 338         0x00000000,
 339         (0x9c00 << 16) | (0x950c >> 2),
 340         0x00000000,
 341         (0x9c00 << 16) | (0x9494 >> 2),
 342         0x00000000,
 343         (0x9c00 << 16) | (0xac0c >> 2),
 344         0x00000000,
 345         (0x9c00 << 16) | (0xac10 >> 2),
 346         0x00000000,
 347         (0x9c00 << 16) | (0xac14 >> 2),
 348         0x00000000,
 349         (0x9c00 << 16) | (0xae00 >> 2),
 350         0x00000000,
 351         (0x9c00 << 16) | (0xac08 >> 2),
 352         0x00000000,
 353         (0x9c00 << 16) | (0x88d4 >> 2),
 354         0x00000000,
 355         (0x9c00 << 16) | (0x88c8 >> 2),
 356         0x00000000,
 357         (0x9c00 << 16) | (0x88cc >> 2),
 358         0x00000000,
 359         (0x9c00 << 16) | (0x89b0 >> 2),
 360         0x00000000,
 361         (0x9c00 << 16) | (0x8b10 >> 2),
 362         0x00000000,
 363         (0x9c00 << 16) | (0x8a14 >> 2),
 364         0x00000000,
 365         (0x9c00 << 16) | (0x9830 >> 2),
 366         0x00000000,
 367         (0x9c00 << 16) | (0x9834 >> 2),
 368         0x00000000,
 369         (0x9c00 << 16) | (0x9838 >> 2),
 370         0x00000000,
 371         (0x9c00 << 16) | (0x9a10 >> 2),
 372         0x00000000,
 373         (0x8000 << 16) | (0x9870 >> 2),
 374         0x00000000,
 375         (0x8000 << 16) | (0x9874 >> 2),
 376         0x00000000,
 377         (0x8001 << 16) | (0x9870 >> 2),
 378         0x00000000,
 379         (0x8001 << 16) | (0x9874 >> 2),
 380         0x00000000,
 381         (0x8040 << 16) | (0x9870 >> 2),
 382         0x00000000,
 383         (0x8040 << 16) | (0x9874 >> 2),
 384         0x00000000,
 385         (0x8041 << 16) | (0x9870 >> 2),
 386         0x00000000,
 387         (0x8041 << 16) | (0x9874 >> 2),
 388         0x00000000,
 389         0x00000000
 390 };
 391 
 392 static const u32 tahiti_golden_rlc_registers[] =
 393 {
 394         0xc424, 0xffffffff, 0x00601005,
 395         0xc47c, 0xffffffff, 0x10104040,
 396         0xc488, 0xffffffff, 0x0100000a,
 397         0xc314, 0xffffffff, 0x00000800,
 398         0xc30c, 0xffffffff, 0x800000f4,
 399         0xf4a8, 0xffffffff, 0x00000000
 400 };
 401 
 402 static const u32 tahiti_golden_registers[] =
 403 {
 404         0x9a10, 0x00010000, 0x00018208,
 405         0x9830, 0xffffffff, 0x00000000,
 406         0x9834, 0xf00fffff, 0x00000400,
 407         0x9838, 0x0002021c, 0x00020200,
 408         0xc78, 0x00000080, 0x00000000,
 409         0xd030, 0x000300c0, 0x00800040,
 410         0xd830, 0x000300c0, 0x00800040,
 411         0x5bb0, 0x000000f0, 0x00000070,
 412         0x5bc0, 0x00200000, 0x50100000,
 413         0x7030, 0x31000311, 0x00000011,
 414         0x277c, 0x00000003, 0x000007ff,
 415         0x240c, 0x000007ff, 0x00000000,
 416         0x8a14, 0xf000001f, 0x00000007,
 417         0x8b24, 0xffffffff, 0x00ffffff,
 418         0x8b10, 0x0000ff0f, 0x00000000,
 419         0x28a4c, 0x07ffffff, 0x4e000000,
 420         0x28350, 0x3f3f3fff, 0x2a00126a,
 421         0x30, 0x000000ff, 0x0040,
 422         0x34, 0x00000040, 0x00004040,
 423         0x9100, 0x07ffffff, 0x03000000,
 424         0x8e88, 0x01ff1f3f, 0x00000000,
 425         0x8e84, 0x01ff1f3f, 0x00000000,
 426         0x9060, 0x0000007f, 0x00000020,
 427         0x9508, 0x00010000, 0x00010000,
 428         0xac14, 0x00000200, 0x000002fb,
 429         0xac10, 0xffffffff, 0x0000543b,
 430         0xac0c, 0xffffffff, 0xa9210876,
 431         0x88d0, 0xffffffff, 0x000fff40,
 432         0x88d4, 0x0000001f, 0x00000010,
 433         0x1410, 0x20000000, 0x20fffed8,
 434         0x15c0, 0x000c0fc0, 0x000c0400
 435 };
 436 
 437 static const u32 tahiti_golden_registers2[] =
 438 {
 439         0xc64, 0x00000001, 0x00000001
 440 };
 441 
 442 static const u32 pitcairn_golden_rlc_registers[] =
 443 {
 444         0xc424, 0xffffffff, 0x00601004,
 445         0xc47c, 0xffffffff, 0x10102020,
 446         0xc488, 0xffffffff, 0x01000020,
 447         0xc314, 0xffffffff, 0x00000800,
 448         0xc30c, 0xffffffff, 0x800000a4
 449 };
 450 
 451 static const u32 pitcairn_golden_registers[] =
 452 {
 453         0x9a10, 0x00010000, 0x00018208,
 454         0x9830, 0xffffffff, 0x00000000,
 455         0x9834, 0xf00fffff, 0x00000400,
 456         0x9838, 0x0002021c, 0x00020200,
 457         0xc78, 0x00000080, 0x00000000,
 458         0xd030, 0x000300c0, 0x00800040,
 459         0xd830, 0x000300c0, 0x00800040,
 460         0x5bb0, 0x000000f0, 0x00000070,
 461         0x5bc0, 0x00200000, 0x50100000,
 462         0x7030, 0x31000311, 0x00000011,
 463         0x2ae4, 0x00073ffe, 0x000022a2,
 464         0x240c, 0x000007ff, 0x00000000,
 465         0x8a14, 0xf000001f, 0x00000007,
 466         0x8b24, 0xffffffff, 0x00ffffff,
 467         0x8b10, 0x0000ff0f, 0x00000000,
 468         0x28a4c, 0x07ffffff, 0x4e000000,
 469         0x28350, 0x3f3f3fff, 0x2a00126a,
 470         0x30, 0x000000ff, 0x0040,
 471         0x34, 0x00000040, 0x00004040,
 472         0x9100, 0x07ffffff, 0x03000000,
 473         0x9060, 0x0000007f, 0x00000020,
 474         0x9508, 0x00010000, 0x00010000,
 475         0xac14, 0x000003ff, 0x000000f7,
 476         0xac10, 0xffffffff, 0x00000000,
 477         0xac0c, 0xffffffff, 0x32761054,
 478         0x88d4, 0x0000001f, 0x00000010,
 479         0x15c0, 0x000c0fc0, 0x000c0400
 480 };
 481 
 482 static const u32 verde_golden_rlc_registers[] =
 483 {
 484         0xc424, 0xffffffff, 0x033f1005,
 485         0xc47c, 0xffffffff, 0x10808020,
 486         0xc488, 0xffffffff, 0x00800008,
 487         0xc314, 0xffffffff, 0x00001000,
 488         0xc30c, 0xffffffff, 0x80010014
 489 };
 490 
 491 static const u32 verde_golden_registers[] =
 492 {
 493         0x9a10, 0x00010000, 0x00018208,
 494         0x9830, 0xffffffff, 0x00000000,
 495         0x9834, 0xf00fffff, 0x00000400,
 496         0x9838, 0x0002021c, 0x00020200,
 497         0xc78, 0x00000080, 0x00000000,
 498         0xd030, 0x000300c0, 0x00800040,
 499         0xd030, 0x000300c0, 0x00800040,
 500         0xd830, 0x000300c0, 0x00800040,
 501         0xd830, 0x000300c0, 0x00800040,
 502         0x5bb0, 0x000000f0, 0x00000070,
 503         0x5bc0, 0x00200000, 0x50100000,
 504         0x7030, 0x31000311, 0x00000011,
 505         0x2ae4, 0x00073ffe, 0x000022a2,
 506         0x2ae4, 0x00073ffe, 0x000022a2,
 507         0x2ae4, 0x00073ffe, 0x000022a2,
 508         0x240c, 0x000007ff, 0x00000000,
 509         0x240c, 0x000007ff, 0x00000000,
 510         0x240c, 0x000007ff, 0x00000000,
 511         0x8a14, 0xf000001f, 0x00000007,
 512         0x8a14, 0xf000001f, 0x00000007,
 513         0x8a14, 0xf000001f, 0x00000007,
 514         0x8b24, 0xffffffff, 0x00ffffff,
 515         0x8b10, 0x0000ff0f, 0x00000000,
 516         0x28a4c, 0x07ffffff, 0x4e000000,
 517         0x28350, 0x3f3f3fff, 0x0000124a,
 518         0x28350, 0x3f3f3fff, 0x0000124a,
 519         0x28350, 0x3f3f3fff, 0x0000124a,
 520         0x30, 0x000000ff, 0x0040,
 521         0x34, 0x00000040, 0x00004040,
 522         0x9100, 0x07ffffff, 0x03000000,
 523         0x9100, 0x07ffffff, 0x03000000,
 524         0x8e88, 0x01ff1f3f, 0x00000000,
 525         0x8e88, 0x01ff1f3f, 0x00000000,
 526         0x8e88, 0x01ff1f3f, 0x00000000,
 527         0x8e84, 0x01ff1f3f, 0x00000000,
 528         0x8e84, 0x01ff1f3f, 0x00000000,
 529         0x8e84, 0x01ff1f3f, 0x00000000,
 530         0x9060, 0x0000007f, 0x00000020,
 531         0x9508, 0x00010000, 0x00010000,
 532         0xac14, 0x000003ff, 0x00000003,
 533         0xac14, 0x000003ff, 0x00000003,
 534         0xac14, 0x000003ff, 0x00000003,
 535         0xac10, 0xffffffff, 0x00000000,
 536         0xac10, 0xffffffff, 0x00000000,
 537         0xac10, 0xffffffff, 0x00000000,
 538         0xac0c, 0xffffffff, 0x00001032,
 539         0xac0c, 0xffffffff, 0x00001032,
 540         0xac0c, 0xffffffff, 0x00001032,
 541         0x88d4, 0x0000001f, 0x00000010,
 542         0x88d4, 0x0000001f, 0x00000010,
 543         0x88d4, 0x0000001f, 0x00000010,
 544         0x15c0, 0x000c0fc0, 0x000c0400
 545 };
 546 
 547 static const u32 oland_golden_rlc_registers[] =
 548 {
 549         0xc424, 0xffffffff, 0x00601005,
 550         0xc47c, 0xffffffff, 0x10104040,
 551         0xc488, 0xffffffff, 0x0100000a,
 552         0xc314, 0xffffffff, 0x00000800,
 553         0xc30c, 0xffffffff, 0x800000f4
 554 };
 555 
 556 static const u32 oland_golden_registers[] =
 557 {
 558         0x9a10, 0x00010000, 0x00018208,
 559         0x9830, 0xffffffff, 0x00000000,
 560         0x9834, 0xf00fffff, 0x00000400,
 561         0x9838, 0x0002021c, 0x00020200,
 562         0xc78, 0x00000080, 0x00000000,
 563         0xd030, 0x000300c0, 0x00800040,
 564         0xd830, 0x000300c0, 0x00800040,
 565         0x5bb0, 0x000000f0, 0x00000070,
 566         0x5bc0, 0x00200000, 0x50100000,
 567         0x7030, 0x31000311, 0x00000011,
 568         0x2ae4, 0x00073ffe, 0x000022a2,
 569         0x240c, 0x000007ff, 0x00000000,
 570         0x8a14, 0xf000001f, 0x00000007,
 571         0x8b24, 0xffffffff, 0x00ffffff,
 572         0x8b10, 0x0000ff0f, 0x00000000,
 573         0x28a4c, 0x07ffffff, 0x4e000000,
 574         0x28350, 0x3f3f3fff, 0x00000082,
 575         0x30, 0x000000ff, 0x0040,
 576         0x34, 0x00000040, 0x00004040,
 577         0x9100, 0x07ffffff, 0x03000000,
 578         0x9060, 0x0000007f, 0x00000020,
 579         0x9508, 0x00010000, 0x00010000,
 580         0xac14, 0x000003ff, 0x000000f3,
 581         0xac10, 0xffffffff, 0x00000000,
 582         0xac0c, 0xffffffff, 0x00003210,
 583         0x88d4, 0x0000001f, 0x00000010,
 584         0x15c0, 0x000c0fc0, 0x000c0400
 585 };
 586 
 587 static const u32 hainan_golden_registers[] =
 588 {
 589         0x9a10, 0x00010000, 0x00018208,
 590         0x9830, 0xffffffff, 0x00000000,
 591         0x9834, 0xf00fffff, 0x00000400,
 592         0x9838, 0x0002021c, 0x00020200,
 593         0xd0c0, 0xff000fff, 0x00000100,
 594         0xd030, 0x000300c0, 0x00800040,
 595         0xd8c0, 0xff000fff, 0x00000100,
 596         0xd830, 0x000300c0, 0x00800040,
 597         0x2ae4, 0x00073ffe, 0x000022a2,
 598         0x240c, 0x000007ff, 0x00000000,
 599         0x8a14, 0xf000001f, 0x00000007,
 600         0x8b24, 0xffffffff, 0x00ffffff,
 601         0x8b10, 0x0000ff0f, 0x00000000,
 602         0x28a4c, 0x07ffffff, 0x4e000000,
 603         0x28350, 0x3f3f3fff, 0x00000000,
 604         0x30, 0x000000ff, 0x0040,
 605         0x34, 0x00000040, 0x00004040,
 606         0x9100, 0x03e00000, 0x03600000,
 607         0x9060, 0x0000007f, 0x00000020,
 608         0x9508, 0x00010000, 0x00010000,
 609         0xac14, 0x000003ff, 0x000000f1,
 610         0xac10, 0xffffffff, 0x00000000,
 611         0xac0c, 0xffffffff, 0x00003210,
 612         0x88d4, 0x0000001f, 0x00000010,
 613         0x15c0, 0x000c0fc0, 0x000c0400
 614 };
 615 
 616 static const u32 hainan_golden_registers2[] =
 617 {
 618         0x98f8, 0xffffffff, 0x02010001
 619 };
 620 
 621 static const u32 tahiti_mgcg_cgcg_init[] =
 622 {
 623         0xc400, 0xffffffff, 0xfffffffc,
 624         0x802c, 0xffffffff, 0xe0000000,
 625         0x9a60, 0xffffffff, 0x00000100,
 626         0x92a4, 0xffffffff, 0x00000100,
 627         0xc164, 0xffffffff, 0x00000100,
 628         0x9774, 0xffffffff, 0x00000100,
 629         0x8984, 0xffffffff, 0x06000100,
 630         0x8a18, 0xffffffff, 0x00000100,
 631         0x92a0, 0xffffffff, 0x00000100,
 632         0xc380, 0xffffffff, 0x00000100,
 633         0x8b28, 0xffffffff, 0x00000100,
 634         0x9144, 0xffffffff, 0x00000100,
 635         0x8d88, 0xffffffff, 0x00000100,
 636         0x8d8c, 0xffffffff, 0x00000100,
 637         0x9030, 0xffffffff, 0x00000100,
 638         0x9034, 0xffffffff, 0x00000100,
 639         0x9038, 0xffffffff, 0x00000100,
 640         0x903c, 0xffffffff, 0x00000100,
 641         0xad80, 0xffffffff, 0x00000100,
 642         0xac54, 0xffffffff, 0x00000100,
 643         0x897c, 0xffffffff, 0x06000100,
 644         0x9868, 0xffffffff, 0x00000100,
 645         0x9510, 0xffffffff, 0x00000100,
 646         0xaf04, 0xffffffff, 0x00000100,
 647         0xae04, 0xffffffff, 0x00000100,
 648         0x949c, 0xffffffff, 0x00000100,
 649         0x802c, 0xffffffff, 0xe0000000,
 650         0x9160, 0xffffffff, 0x00010000,
 651         0x9164, 0xffffffff, 0x00030002,
 652         0x9168, 0xffffffff, 0x00040007,
 653         0x916c, 0xffffffff, 0x00060005,
 654         0x9170, 0xffffffff, 0x00090008,
 655         0x9174, 0xffffffff, 0x00020001,
 656         0x9178, 0xffffffff, 0x00040003,
 657         0x917c, 0xffffffff, 0x00000007,
 658         0x9180, 0xffffffff, 0x00060005,
 659         0x9184, 0xffffffff, 0x00090008,
 660         0x9188, 0xffffffff, 0x00030002,
 661         0x918c, 0xffffffff, 0x00050004,
 662         0x9190, 0xffffffff, 0x00000008,
 663         0x9194, 0xffffffff, 0x00070006,
 664         0x9198, 0xffffffff, 0x000a0009,
 665         0x919c, 0xffffffff, 0x00040003,
 666         0x91a0, 0xffffffff, 0x00060005,
 667         0x91a4, 0xffffffff, 0x00000009,
 668         0x91a8, 0xffffffff, 0x00080007,
 669         0x91ac, 0xffffffff, 0x000b000a,
 670         0x91b0, 0xffffffff, 0x00050004,
 671         0x91b4, 0xffffffff, 0x00070006,
 672         0x91b8, 0xffffffff, 0x0008000b,
 673         0x91bc, 0xffffffff, 0x000a0009,
 674         0x91c0, 0xffffffff, 0x000d000c,
 675         0x91c4, 0xffffffff, 0x00060005,
 676         0x91c8, 0xffffffff, 0x00080007,
 677         0x91cc, 0xffffffff, 0x0000000b,
 678         0x91d0, 0xffffffff, 0x000a0009,
 679         0x91d4, 0xffffffff, 0x000d000c,
 680         0x91d8, 0xffffffff, 0x00070006,
 681         0x91dc, 0xffffffff, 0x00090008,
 682         0x91e0, 0xffffffff, 0x0000000c,
 683         0x91e4, 0xffffffff, 0x000b000a,
 684         0x91e8, 0xffffffff, 0x000e000d,
 685         0x91ec, 0xffffffff, 0x00080007,
 686         0x91f0, 0xffffffff, 0x000a0009,
 687         0x91f4, 0xffffffff, 0x0000000d,
 688         0x91f8, 0xffffffff, 0x000c000b,
 689         0x91fc, 0xffffffff, 0x000f000e,
 690         0x9200, 0xffffffff, 0x00090008,
 691         0x9204, 0xffffffff, 0x000b000a,
 692         0x9208, 0xffffffff, 0x000c000f,
 693         0x920c, 0xffffffff, 0x000e000d,
 694         0x9210, 0xffffffff, 0x00110010,
 695         0x9214, 0xffffffff, 0x000a0009,
 696         0x9218, 0xffffffff, 0x000c000b,
 697         0x921c, 0xffffffff, 0x0000000f,
 698         0x9220, 0xffffffff, 0x000e000d,
 699         0x9224, 0xffffffff, 0x00110010,
 700         0x9228, 0xffffffff, 0x000b000a,
 701         0x922c, 0xffffffff, 0x000d000c,
 702         0x9230, 0xffffffff, 0x00000010,
 703         0x9234, 0xffffffff, 0x000f000e,
 704         0x9238, 0xffffffff, 0x00120011,
 705         0x923c, 0xffffffff, 0x000c000b,
 706         0x9240, 0xffffffff, 0x000e000d,
 707         0x9244, 0xffffffff, 0x00000011,
 708         0x9248, 0xffffffff, 0x0010000f,
 709         0x924c, 0xffffffff, 0x00130012,
 710         0x9250, 0xffffffff, 0x000d000c,
 711         0x9254, 0xffffffff, 0x000f000e,
 712         0x9258, 0xffffffff, 0x00100013,
 713         0x925c, 0xffffffff, 0x00120011,
 714         0x9260, 0xffffffff, 0x00150014,
 715         0x9264, 0xffffffff, 0x000e000d,
 716         0x9268, 0xffffffff, 0x0010000f,
 717         0x926c, 0xffffffff, 0x00000013,
 718         0x9270, 0xffffffff, 0x00120011,
 719         0x9274, 0xffffffff, 0x00150014,
 720         0x9278, 0xffffffff, 0x000f000e,
 721         0x927c, 0xffffffff, 0x00110010,
 722         0x9280, 0xffffffff, 0x00000014,
 723         0x9284, 0xffffffff, 0x00130012,
 724         0x9288, 0xffffffff, 0x00160015,
 725         0x928c, 0xffffffff, 0x0010000f,
 726         0x9290, 0xffffffff, 0x00120011,
 727         0x9294, 0xffffffff, 0x00000015,
 728         0x9298, 0xffffffff, 0x00140013,
 729         0x929c, 0xffffffff, 0x00170016,
 730         0x9150, 0xffffffff, 0x96940200,
 731         0x8708, 0xffffffff, 0x00900100,
 732         0xc478, 0xffffffff, 0x00000080,
 733         0xc404, 0xffffffff, 0x0020003f,
 734         0x30, 0xffffffff, 0x0000001c,
 735         0x34, 0x000f0000, 0x000f0000,
 736         0x160c, 0xffffffff, 0x00000100,
 737         0x1024, 0xffffffff, 0x00000100,
 738         0x102c, 0x00000101, 0x00000000,
 739         0x20a8, 0xffffffff, 0x00000104,
 740         0x264c, 0x000c0000, 0x000c0000,
 741         0x2648, 0x000c0000, 0x000c0000,
 742         0x55e4, 0xff000fff, 0x00000100,
 743         0x55e8, 0x00000001, 0x00000001,
 744         0x2f50, 0x00000001, 0x00000001,
 745         0x30cc, 0xc0000fff, 0x00000104,
 746         0xc1e4, 0x00000001, 0x00000001,
 747         0xd0c0, 0xfffffff0, 0x00000100,
 748         0xd8c0, 0xfffffff0, 0x00000100
 749 };
 750 
 751 static const u32 pitcairn_mgcg_cgcg_init[] =
 752 {
 753         0xc400, 0xffffffff, 0xfffffffc,
 754         0x802c, 0xffffffff, 0xe0000000,
 755         0x9a60, 0xffffffff, 0x00000100,
 756         0x92a4, 0xffffffff, 0x00000100,
 757         0xc164, 0xffffffff, 0x00000100,
 758         0x9774, 0xffffffff, 0x00000100,
 759         0x8984, 0xffffffff, 0x06000100,
 760         0x8a18, 0xffffffff, 0x00000100,
 761         0x92a0, 0xffffffff, 0x00000100,
 762         0xc380, 0xffffffff, 0x00000100,
 763         0x8b28, 0xffffffff, 0x00000100,
 764         0x9144, 0xffffffff, 0x00000100,
 765         0x8d88, 0xffffffff, 0x00000100,
 766         0x8d8c, 0xffffffff, 0x00000100,
 767         0x9030, 0xffffffff, 0x00000100,
 768         0x9034, 0xffffffff, 0x00000100,
 769         0x9038, 0xffffffff, 0x00000100,
 770         0x903c, 0xffffffff, 0x00000100,
 771         0xad80, 0xffffffff, 0x00000100,
 772         0xac54, 0xffffffff, 0x00000100,
 773         0x897c, 0xffffffff, 0x06000100,
 774         0x9868, 0xffffffff, 0x00000100,
 775         0x9510, 0xffffffff, 0x00000100,
 776         0xaf04, 0xffffffff, 0x00000100,
 777         0xae04, 0xffffffff, 0x00000100,
 778         0x949c, 0xffffffff, 0x00000100,
 779         0x802c, 0xffffffff, 0xe0000000,
 780         0x9160, 0xffffffff, 0x00010000,
 781         0x9164, 0xffffffff, 0x00030002,
 782         0x9168, 0xffffffff, 0x00040007,
 783         0x916c, 0xffffffff, 0x00060005,
 784         0x9170, 0xffffffff, 0x00090008,
 785         0x9174, 0xffffffff, 0x00020001,
 786         0x9178, 0xffffffff, 0x00040003,
 787         0x917c, 0xffffffff, 0x00000007,
 788         0x9180, 0xffffffff, 0x00060005,
 789         0x9184, 0xffffffff, 0x00090008,
 790         0x9188, 0xffffffff, 0x00030002,
 791         0x918c, 0xffffffff, 0x00050004,
 792         0x9190, 0xffffffff, 0x00000008,
 793         0x9194, 0xffffffff, 0x00070006,
 794         0x9198, 0xffffffff, 0x000a0009,
 795         0x919c, 0xffffffff, 0x00040003,
 796         0x91a0, 0xffffffff, 0x00060005,
 797         0x91a4, 0xffffffff, 0x00000009,
 798         0x91a8, 0xffffffff, 0x00080007,
 799         0x91ac, 0xffffffff, 0x000b000a,
 800         0x91b0, 0xffffffff, 0x00050004,
 801         0x91b4, 0xffffffff, 0x00070006,
 802         0x91b8, 0xffffffff, 0x0008000b,
 803         0x91bc, 0xffffffff, 0x000a0009,
 804         0x91c0, 0xffffffff, 0x000d000c,
 805         0x9200, 0xffffffff, 0x00090008,
 806         0x9204, 0xffffffff, 0x000b000a,
 807         0x9208, 0xffffffff, 0x000c000f,
 808         0x920c, 0xffffffff, 0x000e000d,
 809         0x9210, 0xffffffff, 0x00110010,
 810         0x9214, 0xffffffff, 0x000a0009,
 811         0x9218, 0xffffffff, 0x000c000b,
 812         0x921c, 0xffffffff, 0x0000000f,
 813         0x9220, 0xffffffff, 0x000e000d,
 814         0x9224, 0xffffffff, 0x00110010,
 815         0x9228, 0xffffffff, 0x000b000a,
 816         0x922c, 0xffffffff, 0x000d000c,
 817         0x9230, 0xffffffff, 0x00000010,
 818         0x9234, 0xffffffff, 0x000f000e,
 819         0x9238, 0xffffffff, 0x00120011,
 820         0x923c, 0xffffffff, 0x000c000b,
 821         0x9240, 0xffffffff, 0x000e000d,
 822         0x9244, 0xffffffff, 0x00000011,
 823         0x9248, 0xffffffff, 0x0010000f,
 824         0x924c, 0xffffffff, 0x00130012,
 825         0x9250, 0xffffffff, 0x000d000c,
 826         0x9254, 0xffffffff, 0x000f000e,
 827         0x9258, 0xffffffff, 0x00100013,
 828         0x925c, 0xffffffff, 0x00120011,
 829         0x9260, 0xffffffff, 0x00150014,
 830         0x9150, 0xffffffff, 0x96940200,
 831         0x8708, 0xffffffff, 0x00900100,
 832         0xc478, 0xffffffff, 0x00000080,
 833         0xc404, 0xffffffff, 0x0020003f,
 834         0x30, 0xffffffff, 0x0000001c,
 835         0x34, 0x000f0000, 0x000f0000,
 836         0x160c, 0xffffffff, 0x00000100,
 837         0x1024, 0xffffffff, 0x00000100,
 838         0x102c, 0x00000101, 0x00000000,
 839         0x20a8, 0xffffffff, 0x00000104,
 840         0x55e4, 0xff000fff, 0x00000100,
 841         0x55e8, 0x00000001, 0x00000001,
 842         0x2f50, 0x00000001, 0x00000001,
 843         0x30cc, 0xc0000fff, 0x00000104,
 844         0xc1e4, 0x00000001, 0x00000001,
 845         0xd0c0, 0xfffffff0, 0x00000100,
 846         0xd8c0, 0xfffffff0, 0x00000100
 847 };
 848 
 849 static const u32 verde_mgcg_cgcg_init[] =
 850 {
 851         0xc400, 0xffffffff, 0xfffffffc,
 852         0x802c, 0xffffffff, 0xe0000000,
 853         0x9a60, 0xffffffff, 0x00000100,
 854         0x92a4, 0xffffffff, 0x00000100,
 855         0xc164, 0xffffffff, 0x00000100,
 856         0x9774, 0xffffffff, 0x00000100,
 857         0x8984, 0xffffffff, 0x06000100,
 858         0x8a18, 0xffffffff, 0x00000100,
 859         0x92a0, 0xffffffff, 0x00000100,
 860         0xc380, 0xffffffff, 0x00000100,
 861         0x8b28, 0xffffffff, 0x00000100,
 862         0x9144, 0xffffffff, 0x00000100,
 863         0x8d88, 0xffffffff, 0x00000100,
 864         0x8d8c, 0xffffffff, 0x00000100,
 865         0x9030, 0xffffffff, 0x00000100,
 866         0x9034, 0xffffffff, 0x00000100,
 867         0x9038, 0xffffffff, 0x00000100,
 868         0x903c, 0xffffffff, 0x00000100,
 869         0xad80, 0xffffffff, 0x00000100,
 870         0xac54, 0xffffffff, 0x00000100,
 871         0x897c, 0xffffffff, 0x06000100,
 872         0x9868, 0xffffffff, 0x00000100,
 873         0x9510, 0xffffffff, 0x00000100,
 874         0xaf04, 0xffffffff, 0x00000100,
 875         0xae04, 0xffffffff, 0x00000100,
 876         0x949c, 0xffffffff, 0x00000100,
 877         0x802c, 0xffffffff, 0xe0000000,
 878         0x9160, 0xffffffff, 0x00010000,
 879         0x9164, 0xffffffff, 0x00030002,
 880         0x9168, 0xffffffff, 0x00040007,
 881         0x916c, 0xffffffff, 0x00060005,
 882         0x9170, 0xffffffff, 0x00090008,
 883         0x9174, 0xffffffff, 0x00020001,
 884         0x9178, 0xffffffff, 0x00040003,
 885         0x917c, 0xffffffff, 0x00000007,
 886         0x9180, 0xffffffff, 0x00060005,
 887         0x9184, 0xffffffff, 0x00090008,
 888         0x9188, 0xffffffff, 0x00030002,
 889         0x918c, 0xffffffff, 0x00050004,
 890         0x9190, 0xffffffff, 0x00000008,
 891         0x9194, 0xffffffff, 0x00070006,
 892         0x9198, 0xffffffff, 0x000a0009,
 893         0x919c, 0xffffffff, 0x00040003,
 894         0x91a0, 0xffffffff, 0x00060005,
 895         0x91a4, 0xffffffff, 0x00000009,
 896         0x91a8, 0xffffffff, 0x00080007,
 897         0x91ac, 0xffffffff, 0x000b000a,
 898         0x91b0, 0xffffffff, 0x00050004,
 899         0x91b4, 0xffffffff, 0x00070006,
 900         0x91b8, 0xffffffff, 0x0008000b,
 901         0x91bc, 0xffffffff, 0x000a0009,
 902         0x91c0, 0xffffffff, 0x000d000c,
 903         0x9200, 0xffffffff, 0x00090008,
 904         0x9204, 0xffffffff, 0x000b000a,
 905         0x9208, 0xffffffff, 0x000c000f,
 906         0x920c, 0xffffffff, 0x000e000d,
 907         0x9210, 0xffffffff, 0x00110010,
 908         0x9214, 0xffffffff, 0x000a0009,
 909         0x9218, 0xffffffff, 0x000c000b,
 910         0x921c, 0xffffffff, 0x0000000f,
 911         0x9220, 0xffffffff, 0x000e000d,
 912         0x9224, 0xffffffff, 0x00110010,
 913         0x9228, 0xffffffff, 0x000b000a,
 914         0x922c, 0xffffffff, 0x000d000c,
 915         0x9230, 0xffffffff, 0x00000010,
 916         0x9234, 0xffffffff, 0x000f000e,
 917         0x9238, 0xffffffff, 0x00120011,
 918         0x923c, 0xffffffff, 0x000c000b,
 919         0x9240, 0xffffffff, 0x000e000d,
 920         0x9244, 0xffffffff, 0x00000011,
 921         0x9248, 0xffffffff, 0x0010000f,
 922         0x924c, 0xffffffff, 0x00130012,
 923         0x9250, 0xffffffff, 0x000d000c,
 924         0x9254, 0xffffffff, 0x000f000e,
 925         0x9258, 0xffffffff, 0x00100013,
 926         0x925c, 0xffffffff, 0x00120011,
 927         0x9260, 0xffffffff, 0x00150014,
 928         0x9150, 0xffffffff, 0x96940200,
 929         0x8708, 0xffffffff, 0x00900100,
 930         0xc478, 0xffffffff, 0x00000080,
 931         0xc404, 0xffffffff, 0x0020003f,
 932         0x30, 0xffffffff, 0x0000001c,
 933         0x34, 0x000f0000, 0x000f0000,
 934         0x160c, 0xffffffff, 0x00000100,
 935         0x1024, 0xffffffff, 0x00000100,
 936         0x102c, 0x00000101, 0x00000000,
 937         0x20a8, 0xffffffff, 0x00000104,
 938         0x264c, 0x000c0000, 0x000c0000,
 939         0x2648, 0x000c0000, 0x000c0000,
 940         0x55e4, 0xff000fff, 0x00000100,
 941         0x55e8, 0x00000001, 0x00000001,
 942         0x2f50, 0x00000001, 0x00000001,
 943         0x30cc, 0xc0000fff, 0x00000104,
 944         0xc1e4, 0x00000001, 0x00000001,
 945         0xd0c0, 0xfffffff0, 0x00000100,
 946         0xd8c0, 0xfffffff0, 0x00000100
 947 };
 948 
 949 static const u32 oland_mgcg_cgcg_init[] =
 950 {
 951         0xc400, 0xffffffff, 0xfffffffc,
 952         0x802c, 0xffffffff, 0xe0000000,
 953         0x9a60, 0xffffffff, 0x00000100,
 954         0x92a4, 0xffffffff, 0x00000100,
 955         0xc164, 0xffffffff, 0x00000100,
 956         0x9774, 0xffffffff, 0x00000100,
 957         0x8984, 0xffffffff, 0x06000100,
 958         0x8a18, 0xffffffff, 0x00000100,
 959         0x92a0, 0xffffffff, 0x00000100,
 960         0xc380, 0xffffffff, 0x00000100,
 961         0x8b28, 0xffffffff, 0x00000100,
 962         0x9144, 0xffffffff, 0x00000100,
 963         0x8d88, 0xffffffff, 0x00000100,
 964         0x8d8c, 0xffffffff, 0x00000100,
 965         0x9030, 0xffffffff, 0x00000100,
 966         0x9034, 0xffffffff, 0x00000100,
 967         0x9038, 0xffffffff, 0x00000100,
 968         0x903c, 0xffffffff, 0x00000100,
 969         0xad80, 0xffffffff, 0x00000100,
 970         0xac54, 0xffffffff, 0x00000100,
 971         0x897c, 0xffffffff, 0x06000100,
 972         0x9868, 0xffffffff, 0x00000100,
 973         0x9510, 0xffffffff, 0x00000100,
 974         0xaf04, 0xffffffff, 0x00000100,
 975         0xae04, 0xffffffff, 0x00000100,
 976         0x949c, 0xffffffff, 0x00000100,
 977         0x802c, 0xffffffff, 0xe0000000,
 978         0x9160, 0xffffffff, 0x00010000,
 979         0x9164, 0xffffffff, 0x00030002,
 980         0x9168, 0xffffffff, 0x00040007,
 981         0x916c, 0xffffffff, 0x00060005,
 982         0x9170, 0xffffffff, 0x00090008,
 983         0x9174, 0xffffffff, 0x00020001,
 984         0x9178, 0xffffffff, 0x00040003,
 985         0x917c, 0xffffffff, 0x00000007,
 986         0x9180, 0xffffffff, 0x00060005,
 987         0x9184, 0xffffffff, 0x00090008,
 988         0x9188, 0xffffffff, 0x00030002,
 989         0x918c, 0xffffffff, 0x00050004,
 990         0x9190, 0xffffffff, 0x00000008,
 991         0x9194, 0xffffffff, 0x00070006,
 992         0x9198, 0xffffffff, 0x000a0009,
 993         0x919c, 0xffffffff, 0x00040003,
 994         0x91a0, 0xffffffff, 0x00060005,
 995         0x91a4, 0xffffffff, 0x00000009,
 996         0x91a8, 0xffffffff, 0x00080007,
 997         0x91ac, 0xffffffff, 0x000b000a,
 998         0x91b0, 0xffffffff, 0x00050004,
 999         0x91b4, 0xffffffff, 0x00070006,
1000         0x91b8, 0xffffffff, 0x0008000b,
1001         0x91bc, 0xffffffff, 0x000a0009,
1002         0x91c0, 0xffffffff, 0x000d000c,
1003         0x91c4, 0xffffffff, 0x00060005,
1004         0x91c8, 0xffffffff, 0x00080007,
1005         0x91cc, 0xffffffff, 0x0000000b,
1006         0x91d0, 0xffffffff, 0x000a0009,
1007         0x91d4, 0xffffffff, 0x000d000c,
1008         0x9150, 0xffffffff, 0x96940200,
1009         0x8708, 0xffffffff, 0x00900100,
1010         0xc478, 0xffffffff, 0x00000080,
1011         0xc404, 0xffffffff, 0x0020003f,
1012         0x30, 0xffffffff, 0x0000001c,
1013         0x34, 0x000f0000, 0x000f0000,
1014         0x160c, 0xffffffff, 0x00000100,
1015         0x1024, 0xffffffff, 0x00000100,
1016         0x102c, 0x00000101, 0x00000000,
1017         0x20a8, 0xffffffff, 0x00000104,
1018         0x264c, 0x000c0000, 0x000c0000,
1019         0x2648, 0x000c0000, 0x000c0000,
1020         0x55e4, 0xff000fff, 0x00000100,
1021         0x55e8, 0x00000001, 0x00000001,
1022         0x2f50, 0x00000001, 0x00000001,
1023         0x30cc, 0xc0000fff, 0x00000104,
1024         0xc1e4, 0x00000001, 0x00000001,
1025         0xd0c0, 0xfffffff0, 0x00000100,
1026         0xd8c0, 0xfffffff0, 0x00000100
1027 };
1028 
1029 static const u32 hainan_mgcg_cgcg_init[] =
1030 {
1031         0xc400, 0xffffffff, 0xfffffffc,
1032         0x802c, 0xffffffff, 0xe0000000,
1033         0x9a60, 0xffffffff, 0x00000100,
1034         0x92a4, 0xffffffff, 0x00000100,
1035         0xc164, 0xffffffff, 0x00000100,
1036         0x9774, 0xffffffff, 0x00000100,
1037         0x8984, 0xffffffff, 0x06000100,
1038         0x8a18, 0xffffffff, 0x00000100,
1039         0x92a0, 0xffffffff, 0x00000100,
1040         0xc380, 0xffffffff, 0x00000100,
1041         0x8b28, 0xffffffff, 0x00000100,
1042         0x9144, 0xffffffff, 0x00000100,
1043         0x8d88, 0xffffffff, 0x00000100,
1044         0x8d8c, 0xffffffff, 0x00000100,
1045         0x9030, 0xffffffff, 0x00000100,
1046         0x9034, 0xffffffff, 0x00000100,
1047         0x9038, 0xffffffff, 0x00000100,
1048         0x903c, 0xffffffff, 0x00000100,
1049         0xad80, 0xffffffff, 0x00000100,
1050         0xac54, 0xffffffff, 0x00000100,
1051         0x897c, 0xffffffff, 0x06000100,
1052         0x9868, 0xffffffff, 0x00000100,
1053         0x9510, 0xffffffff, 0x00000100,
1054         0xaf04, 0xffffffff, 0x00000100,
1055         0xae04, 0xffffffff, 0x00000100,
1056         0x949c, 0xffffffff, 0x00000100,
1057         0x802c, 0xffffffff, 0xe0000000,
1058         0x9160, 0xffffffff, 0x00010000,
1059         0x9164, 0xffffffff, 0x00030002,
1060         0x9168, 0xffffffff, 0x00040007,
1061         0x916c, 0xffffffff, 0x00060005,
1062         0x9170, 0xffffffff, 0x00090008,
1063         0x9174, 0xffffffff, 0x00020001,
1064         0x9178, 0xffffffff, 0x00040003,
1065         0x917c, 0xffffffff, 0x00000007,
1066         0x9180, 0xffffffff, 0x00060005,
1067         0x9184, 0xffffffff, 0x00090008,
1068         0x9188, 0xffffffff, 0x00030002,
1069         0x918c, 0xffffffff, 0x00050004,
1070         0x9190, 0xffffffff, 0x00000008,
1071         0x9194, 0xffffffff, 0x00070006,
1072         0x9198, 0xffffffff, 0x000a0009,
1073         0x919c, 0xffffffff, 0x00040003,
1074         0x91a0, 0xffffffff, 0x00060005,
1075         0x91a4, 0xffffffff, 0x00000009,
1076         0x91a8, 0xffffffff, 0x00080007,
1077         0x91ac, 0xffffffff, 0x000b000a,
1078         0x91b0, 0xffffffff, 0x00050004,
1079         0x91b4, 0xffffffff, 0x00070006,
1080         0x91b8, 0xffffffff, 0x0008000b,
1081         0x91bc, 0xffffffff, 0x000a0009,
1082         0x91c0, 0xffffffff, 0x000d000c,
1083         0x91c4, 0xffffffff, 0x00060005,
1084         0x91c8, 0xffffffff, 0x00080007,
1085         0x91cc, 0xffffffff, 0x0000000b,
1086         0x91d0, 0xffffffff, 0x000a0009,
1087         0x91d4, 0xffffffff, 0x000d000c,
1088         0x9150, 0xffffffff, 0x96940200,
1089         0x8708, 0xffffffff, 0x00900100,
1090         0xc478, 0xffffffff, 0x00000080,
1091         0xc404, 0xffffffff, 0x0020003f,
1092         0x30, 0xffffffff, 0x0000001c,
1093         0x34, 0x000f0000, 0x000f0000,
1094         0x160c, 0xffffffff, 0x00000100,
1095         0x1024, 0xffffffff, 0x00000100,
1096         0x20a8, 0xffffffff, 0x00000104,
1097         0x264c, 0x000c0000, 0x000c0000,
1098         0x2648, 0x000c0000, 0x000c0000,
1099         0x2f50, 0x00000001, 0x00000001,
1100         0x30cc, 0xc0000fff, 0x00000104,
1101         0xc1e4, 0x00000001, 0x00000001,
1102         0xd0c0, 0xfffffff0, 0x00000100,
1103         0xd8c0, 0xfffffff0, 0x00000100
1104 };
1105 
1106 static u32 verde_pg_init[] =
1107 {
1108         0x353c, 0xffffffff, 0x40000,
1109         0x3538, 0xffffffff, 0x200010ff,
1110         0x353c, 0xffffffff, 0x0,
1111         0x353c, 0xffffffff, 0x0,
1112         0x353c, 0xffffffff, 0x0,
1113         0x353c, 0xffffffff, 0x0,
1114         0x353c, 0xffffffff, 0x0,
1115         0x353c, 0xffffffff, 0x7007,
1116         0x3538, 0xffffffff, 0x300010ff,
1117         0x353c, 0xffffffff, 0x0,
1118         0x353c, 0xffffffff, 0x0,
1119         0x353c, 0xffffffff, 0x0,
1120         0x353c, 0xffffffff, 0x0,
1121         0x353c, 0xffffffff, 0x0,
1122         0x353c, 0xffffffff, 0x400000,
1123         0x3538, 0xffffffff, 0x100010ff,
1124         0x353c, 0xffffffff, 0x0,
1125         0x353c, 0xffffffff, 0x0,
1126         0x353c, 0xffffffff, 0x0,
1127         0x353c, 0xffffffff, 0x0,
1128         0x353c, 0xffffffff, 0x0,
1129         0x353c, 0xffffffff, 0x120200,
1130         0x3538, 0xffffffff, 0x500010ff,
1131         0x353c, 0xffffffff, 0x0,
1132         0x353c, 0xffffffff, 0x0,
1133         0x353c, 0xffffffff, 0x0,
1134         0x353c, 0xffffffff, 0x0,
1135         0x353c, 0xffffffff, 0x0,
1136         0x353c, 0xffffffff, 0x1e1e16,
1137         0x3538, 0xffffffff, 0x600010ff,
1138         0x353c, 0xffffffff, 0x0,
1139         0x353c, 0xffffffff, 0x0,
1140         0x353c, 0xffffffff, 0x0,
1141         0x353c, 0xffffffff, 0x0,
1142         0x353c, 0xffffffff, 0x0,
1143         0x353c, 0xffffffff, 0x171f1e,
1144         0x3538, 0xffffffff, 0x700010ff,
1145         0x353c, 0xffffffff, 0x0,
1146         0x353c, 0xffffffff, 0x0,
1147         0x353c, 0xffffffff, 0x0,
1148         0x353c, 0xffffffff, 0x0,
1149         0x353c, 0xffffffff, 0x0,
1150         0x353c, 0xffffffff, 0x0,
1151         0x3538, 0xffffffff, 0x9ff,
1152         0x3500, 0xffffffff, 0x0,
1153         0x3504, 0xffffffff, 0x10000800,
1154         0x3504, 0xffffffff, 0xf,
1155         0x3504, 0xffffffff, 0xf,
1156         0x3500, 0xffffffff, 0x4,
1157         0x3504, 0xffffffff, 0x1000051e,
1158         0x3504, 0xffffffff, 0xffff,
1159         0x3504, 0xffffffff, 0xffff,
1160         0x3500, 0xffffffff, 0x8,
1161         0x3504, 0xffffffff, 0x80500,
1162         0x3500, 0xffffffff, 0x12,
1163         0x3504, 0xffffffff, 0x9050c,
1164         0x3500, 0xffffffff, 0x1d,
1165         0x3504, 0xffffffff, 0xb052c,
1166         0x3500, 0xffffffff, 0x2a,
1167         0x3504, 0xffffffff, 0x1053e,
1168         0x3500, 0xffffffff, 0x2d,
1169         0x3504, 0xffffffff, 0x10546,
1170         0x3500, 0xffffffff, 0x30,
1171         0x3504, 0xffffffff, 0xa054e,
1172         0x3500, 0xffffffff, 0x3c,
1173         0x3504, 0xffffffff, 0x1055f,
1174         0x3500, 0xffffffff, 0x3f,
1175         0x3504, 0xffffffff, 0x10567,
1176         0x3500, 0xffffffff, 0x42,
1177         0x3504, 0xffffffff, 0x1056f,
1178         0x3500, 0xffffffff, 0x45,
1179         0x3504, 0xffffffff, 0x10572,
1180         0x3500, 0xffffffff, 0x48,
1181         0x3504, 0xffffffff, 0x20575,
1182         0x3500, 0xffffffff, 0x4c,
1183         0x3504, 0xffffffff, 0x190801,
1184         0x3500, 0xffffffff, 0x67,
1185         0x3504, 0xffffffff, 0x1082a,
1186         0x3500, 0xffffffff, 0x6a,
1187         0x3504, 0xffffffff, 0x1b082d,
1188         0x3500, 0xffffffff, 0x87,
1189         0x3504, 0xffffffff, 0x310851,
1190         0x3500, 0xffffffff, 0xba,
1191         0x3504, 0xffffffff, 0x891,
1192         0x3500, 0xffffffff, 0xbc,
1193         0x3504, 0xffffffff, 0x893,
1194         0x3500, 0xffffffff, 0xbe,
1195         0x3504, 0xffffffff, 0x20895,
1196         0x3500, 0xffffffff, 0xc2,
1197         0x3504, 0xffffffff, 0x20899,
1198         0x3500, 0xffffffff, 0xc6,
1199         0x3504, 0xffffffff, 0x2089d,
1200         0x3500, 0xffffffff, 0xca,
1201         0x3504, 0xffffffff, 0x8a1,
1202         0x3500, 0xffffffff, 0xcc,
1203         0x3504, 0xffffffff, 0x8a3,
1204         0x3500, 0xffffffff, 0xce,
1205         0x3504, 0xffffffff, 0x308a5,
1206         0x3500, 0xffffffff, 0xd3,
1207         0x3504, 0xffffffff, 0x6d08cd,
1208         0x3500, 0xffffffff, 0x142,
1209         0x3504, 0xffffffff, 0x2000095a,
1210         0x3504, 0xffffffff, 0x1,
1211         0x3500, 0xffffffff, 0x144,
1212         0x3504, 0xffffffff, 0x301f095b,
1213         0x3500, 0xffffffff, 0x165,
1214         0x3504, 0xffffffff, 0xc094d,
1215         0x3500, 0xffffffff, 0x173,
1216         0x3504, 0xffffffff, 0xf096d,
1217         0x3500, 0xffffffff, 0x184,
1218         0x3504, 0xffffffff, 0x15097f,
1219         0x3500, 0xffffffff, 0x19b,
1220         0x3504, 0xffffffff, 0xc0998,
1221         0x3500, 0xffffffff, 0x1a9,
1222         0x3504, 0xffffffff, 0x409a7,
1223         0x3500, 0xffffffff, 0x1af,
1224         0x3504, 0xffffffff, 0xcdc,
1225         0x3500, 0xffffffff, 0x1b1,
1226         0x3504, 0xffffffff, 0x800,
1227         0x3508, 0xffffffff, 0x6c9b2000,
1228         0x3510, 0xfc00, 0x2000,
1229         0x3544, 0xffffffff, 0xfc0,
1230         0x28d4, 0x00000100, 0x100
1231 };
1232 
1233 static void si_init_golden_registers(struct radeon_device *rdev)
1234 {
1235         switch (rdev->family) {
1236         case CHIP_TAHITI:
1237                 radeon_program_register_sequence(rdev,
1238                                                  tahiti_golden_registers,
1239                                                  (const u32)ARRAY_SIZE(tahiti_golden_registers));
1240                 radeon_program_register_sequence(rdev,
1241                                                  tahiti_golden_rlc_registers,
1242                                                  (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
1243                 radeon_program_register_sequence(rdev,
1244                                                  tahiti_mgcg_cgcg_init,
1245                                                  (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1246                 radeon_program_register_sequence(rdev,
1247                                                  tahiti_golden_registers2,
1248                                                  (const u32)ARRAY_SIZE(tahiti_golden_registers2));
1249                 break;
1250         case CHIP_PITCAIRN:
1251                 radeon_program_register_sequence(rdev,
1252                                                  pitcairn_golden_registers,
1253                                                  (const u32)ARRAY_SIZE(pitcairn_golden_registers));
1254                 radeon_program_register_sequence(rdev,
1255                                                  pitcairn_golden_rlc_registers,
1256                                                  (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
1257                 radeon_program_register_sequence(rdev,
1258                                                  pitcairn_mgcg_cgcg_init,
1259                                                  (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1260                 break;
1261         case CHIP_VERDE:
1262                 radeon_program_register_sequence(rdev,
1263                                                  verde_golden_registers,
1264                                                  (const u32)ARRAY_SIZE(verde_golden_registers));
1265                 radeon_program_register_sequence(rdev,
1266                                                  verde_golden_rlc_registers,
1267                                                  (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
1268                 radeon_program_register_sequence(rdev,
1269                                                  verde_mgcg_cgcg_init,
1270                                                  (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
1271                 radeon_program_register_sequence(rdev,
1272                                                  verde_pg_init,
1273                                                  (const u32)ARRAY_SIZE(verde_pg_init));
1274                 break;
1275         case CHIP_OLAND:
1276                 radeon_program_register_sequence(rdev,
1277                                                  oland_golden_registers,
1278                                                  (const u32)ARRAY_SIZE(oland_golden_registers));
1279                 radeon_program_register_sequence(rdev,
1280                                                  oland_golden_rlc_registers,
1281                                                  (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
1282                 radeon_program_register_sequence(rdev,
1283                                                  oland_mgcg_cgcg_init,
1284                                                  (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
1285                 break;
1286         case CHIP_HAINAN:
1287                 radeon_program_register_sequence(rdev,
1288                                                  hainan_golden_registers,
1289                                                  (const u32)ARRAY_SIZE(hainan_golden_registers));
1290                 radeon_program_register_sequence(rdev,
1291                                                  hainan_golden_registers2,
1292                                                  (const u32)ARRAY_SIZE(hainan_golden_registers2));
1293                 radeon_program_register_sequence(rdev,
1294                                                  hainan_mgcg_cgcg_init,
1295                                                  (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
1296                 break;
1297         default:
1298                 break;
1299         }
1300 }
1301 
1302 /**
1303  * si_get_allowed_info_register - fetch the register for the info ioctl
1304  *
1305  * @rdev: radeon_device pointer
1306  * @reg: register offset in bytes
1307  * @val: register value
1308  *
1309  * Returns 0 for success or -EINVAL for an invalid register
1310  *
1311  */
1312 int si_get_allowed_info_register(struct radeon_device *rdev,
1313                                  u32 reg, u32 *val)
1314 {
1315         switch (reg) {
1316         case GRBM_STATUS:
1317         case GRBM_STATUS2:
1318         case GRBM_STATUS_SE0:
1319         case GRBM_STATUS_SE1:
1320         case SRBM_STATUS:
1321         case SRBM_STATUS2:
1322         case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
1323         case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
1324         case UVD_STATUS:
1325                 *val = RREG32(reg);
1326                 return 0;
1327         default:
1328                 return -EINVAL;
1329         }
1330 }
1331 
1332 #define PCIE_BUS_CLK                10000
1333 #define TCLK                        (PCIE_BUS_CLK / 10)
1334 
1335 /**
1336  * si_get_xclk - get the xclk
1337  *
1338  * @rdev: radeon_device pointer
1339  *
1340  * Returns the reference clock used by the gfx engine
1341  * (SI).
1342  */
1343 u32 si_get_xclk(struct radeon_device *rdev)
1344 {
1345         u32 reference_clock = rdev->clock.spll.reference_freq;
1346         u32 tmp;
1347 
1348         tmp = RREG32(CG_CLKPIN_CNTL_2);
1349         if (tmp & MUX_TCLK_TO_XCLK)
1350                 return TCLK;
1351 
1352         tmp = RREG32(CG_CLKPIN_CNTL);
1353         if (tmp & XTALIN_DIVIDE)
1354                 return reference_clock / 4;
1355 
1356         return reference_clock;
1357 }
1358 
1359 /* get temperature in millidegrees */
1360 int si_get_temp(struct radeon_device *rdev)
1361 {
1362         u32 temp;
1363         int actual_temp = 0;
1364 
1365         temp = (RREG32(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
1366                 CTF_TEMP_SHIFT;
1367 
1368         if (temp & 0x200)
1369                 actual_temp = 255;
1370         else
1371                 actual_temp = temp & 0x1ff;
1372 
1373         actual_temp = (actual_temp * 1000);
1374 
1375         return actual_temp;
1376 }
1377 
1378 #define TAHITI_IO_MC_REGS_SIZE 36
1379 
1380 static const u32 tahiti_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1381         {0x0000006f, 0x03044000},
1382         {0x00000070, 0x0480c018},
1383         {0x00000071, 0x00000040},
1384         {0x00000072, 0x01000000},
1385         {0x00000074, 0x000000ff},
1386         {0x00000075, 0x00143400},
1387         {0x00000076, 0x08ec0800},
1388         {0x00000077, 0x040000cc},
1389         {0x00000079, 0x00000000},
1390         {0x0000007a, 0x21000409},
1391         {0x0000007c, 0x00000000},
1392         {0x0000007d, 0xe8000000},
1393         {0x0000007e, 0x044408a8},
1394         {0x0000007f, 0x00000003},
1395         {0x00000080, 0x00000000},
1396         {0x00000081, 0x01000000},
1397         {0x00000082, 0x02000000},
1398         {0x00000083, 0x00000000},
1399         {0x00000084, 0xe3f3e4f4},
1400         {0x00000085, 0x00052024},
1401         {0x00000087, 0x00000000},
1402         {0x00000088, 0x66036603},
1403         {0x00000089, 0x01000000},
1404         {0x0000008b, 0x1c0a0000},
1405         {0x0000008c, 0xff010000},
1406         {0x0000008e, 0xffffefff},
1407         {0x0000008f, 0xfff3efff},
1408         {0x00000090, 0xfff3efbf},
1409         {0x00000094, 0x00101101},
1410         {0x00000095, 0x00000fff},
1411         {0x00000096, 0x00116fff},
1412         {0x00000097, 0x60010000},
1413         {0x00000098, 0x10010000},
1414         {0x00000099, 0x00006000},
1415         {0x0000009a, 0x00001000},
1416         {0x0000009f, 0x00a77400}
1417 };
1418 
1419 static const u32 pitcairn_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1420         {0x0000006f, 0x03044000},
1421         {0x00000070, 0x0480c018},
1422         {0x00000071, 0x00000040},
1423         {0x00000072, 0x01000000},
1424         {0x00000074, 0x000000ff},
1425         {0x00000075, 0x00143400},
1426         {0x00000076, 0x08ec0800},
1427         {0x00000077, 0x040000cc},
1428         {0x00000079, 0x00000000},
1429         {0x0000007a, 0x21000409},
1430         {0x0000007c, 0x00000000},
1431         {0x0000007d, 0xe8000000},
1432         {0x0000007e, 0x044408a8},
1433         {0x0000007f, 0x00000003},
1434         {0x00000080, 0x00000000},
1435         {0x00000081, 0x01000000},
1436         {0x00000082, 0x02000000},
1437         {0x00000083, 0x00000000},
1438         {0x00000084, 0xe3f3e4f4},
1439         {0x00000085, 0x00052024},
1440         {0x00000087, 0x00000000},
1441         {0x00000088, 0x66036603},
1442         {0x00000089, 0x01000000},
1443         {0x0000008b, 0x1c0a0000},
1444         {0x0000008c, 0xff010000},
1445         {0x0000008e, 0xffffefff},
1446         {0x0000008f, 0xfff3efff},
1447         {0x00000090, 0xfff3efbf},
1448         {0x00000094, 0x00101101},
1449         {0x00000095, 0x00000fff},
1450         {0x00000096, 0x00116fff},
1451         {0x00000097, 0x60010000},
1452         {0x00000098, 0x10010000},
1453         {0x00000099, 0x00006000},
1454         {0x0000009a, 0x00001000},
1455         {0x0000009f, 0x00a47400}
1456 };
1457 
1458 static const u32 verde_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1459         {0x0000006f, 0x03044000},
1460         {0x00000070, 0x0480c018},
1461         {0x00000071, 0x00000040},
1462         {0x00000072, 0x01000000},
1463         {0x00000074, 0x000000ff},
1464         {0x00000075, 0x00143400},
1465         {0x00000076, 0x08ec0800},
1466         {0x00000077, 0x040000cc},
1467         {0x00000079, 0x00000000},
1468         {0x0000007a, 0x21000409},
1469         {0x0000007c, 0x00000000},
1470         {0x0000007d, 0xe8000000},
1471         {0x0000007e, 0x044408a8},
1472         {0x0000007f, 0x00000003},
1473         {0x00000080, 0x00000000},
1474         {0x00000081, 0x01000000},
1475         {0x00000082, 0x02000000},
1476         {0x00000083, 0x00000000},
1477         {0x00000084, 0xe3f3e4f4},
1478         {0x00000085, 0x00052024},
1479         {0x00000087, 0x00000000},
1480         {0x00000088, 0x66036603},
1481         {0x00000089, 0x01000000},
1482         {0x0000008b, 0x1c0a0000},
1483         {0x0000008c, 0xff010000},
1484         {0x0000008e, 0xffffefff},
1485         {0x0000008f, 0xfff3efff},
1486         {0x00000090, 0xfff3efbf},
1487         {0x00000094, 0x00101101},
1488         {0x00000095, 0x00000fff},
1489         {0x00000096, 0x00116fff},
1490         {0x00000097, 0x60010000},
1491         {0x00000098, 0x10010000},
1492         {0x00000099, 0x00006000},
1493         {0x0000009a, 0x00001000},
1494         {0x0000009f, 0x00a37400}
1495 };
1496 
1497 static const u32 oland_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1498         {0x0000006f, 0x03044000},
1499         {0x00000070, 0x0480c018},
1500         {0x00000071, 0x00000040},
1501         {0x00000072, 0x01000000},
1502         {0x00000074, 0x000000ff},
1503         {0x00000075, 0x00143400},
1504         {0x00000076, 0x08ec0800},
1505         {0x00000077, 0x040000cc},
1506         {0x00000079, 0x00000000},
1507         {0x0000007a, 0x21000409},
1508         {0x0000007c, 0x00000000},
1509         {0x0000007d, 0xe8000000},
1510         {0x0000007e, 0x044408a8},
1511         {0x0000007f, 0x00000003},
1512         {0x00000080, 0x00000000},
1513         {0x00000081, 0x01000000},
1514         {0x00000082, 0x02000000},
1515         {0x00000083, 0x00000000},
1516         {0x00000084, 0xe3f3e4f4},
1517         {0x00000085, 0x00052024},
1518         {0x00000087, 0x00000000},
1519         {0x00000088, 0x66036603},
1520         {0x00000089, 0x01000000},
1521         {0x0000008b, 0x1c0a0000},
1522         {0x0000008c, 0xff010000},
1523         {0x0000008e, 0xffffefff},
1524         {0x0000008f, 0xfff3efff},
1525         {0x00000090, 0xfff3efbf},
1526         {0x00000094, 0x00101101},
1527         {0x00000095, 0x00000fff},
1528         {0x00000096, 0x00116fff},
1529         {0x00000097, 0x60010000},
1530         {0x00000098, 0x10010000},
1531         {0x00000099, 0x00006000},
1532         {0x0000009a, 0x00001000},
1533         {0x0000009f, 0x00a17730}
1534 };
1535 
1536 static const u32 hainan_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1537         {0x0000006f, 0x03044000},
1538         {0x00000070, 0x0480c018},
1539         {0x00000071, 0x00000040},
1540         {0x00000072, 0x01000000},
1541         {0x00000074, 0x000000ff},
1542         {0x00000075, 0x00143400},
1543         {0x00000076, 0x08ec0800},
1544         {0x00000077, 0x040000cc},
1545         {0x00000079, 0x00000000},
1546         {0x0000007a, 0x21000409},
1547         {0x0000007c, 0x00000000},
1548         {0x0000007d, 0xe8000000},
1549         {0x0000007e, 0x044408a8},
1550         {0x0000007f, 0x00000003},
1551         {0x00000080, 0x00000000},
1552         {0x00000081, 0x01000000},
1553         {0x00000082, 0x02000000},
1554         {0x00000083, 0x00000000},
1555         {0x00000084, 0xe3f3e4f4},
1556         {0x00000085, 0x00052024},
1557         {0x00000087, 0x00000000},
1558         {0x00000088, 0x66036603},
1559         {0x00000089, 0x01000000},
1560         {0x0000008b, 0x1c0a0000},
1561         {0x0000008c, 0xff010000},
1562         {0x0000008e, 0xffffefff},
1563         {0x0000008f, 0xfff3efff},
1564         {0x00000090, 0xfff3efbf},
1565         {0x00000094, 0x00101101},
1566         {0x00000095, 0x00000fff},
1567         {0x00000096, 0x00116fff},
1568         {0x00000097, 0x60010000},
1569         {0x00000098, 0x10010000},
1570         {0x00000099, 0x00006000},
1571         {0x0000009a, 0x00001000},
1572         {0x0000009f, 0x00a07730}
1573 };
1574 
1575 /* ucode loading */
1576 int si_mc_load_microcode(struct radeon_device *rdev)
1577 {
1578         const __be32 *fw_data = NULL;
1579         const __le32 *new_fw_data = NULL;
1580         u32 running;
1581         u32 *io_mc_regs = NULL;
1582         const __le32 *new_io_mc_regs = NULL;
1583         int i, regs_size, ucode_size;
1584 
1585         if (!rdev->mc_fw)
1586                 return -EINVAL;
1587 
1588         if (rdev->new_fw) {
1589                 const struct mc_firmware_header_v1_0 *hdr =
1590                         (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
1591 
1592                 radeon_ucode_print_mc_hdr(&hdr->header);
1593                 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
1594                 new_io_mc_regs = (const __le32 *)
1595                         (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
1596                 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
1597                 new_fw_data = (const __le32 *)
1598                         (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1599         } else {
1600                 ucode_size = rdev->mc_fw->size / 4;
1601 
1602                 switch (rdev->family) {
1603                 case CHIP_TAHITI:
1604                         io_mc_regs = (u32 *)&tahiti_io_mc_regs;
1605                         regs_size = TAHITI_IO_MC_REGS_SIZE;
1606                         break;
1607                 case CHIP_PITCAIRN:
1608                         io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
1609                         regs_size = TAHITI_IO_MC_REGS_SIZE;
1610                         break;
1611                 case CHIP_VERDE:
1612                 default:
1613                         io_mc_regs = (u32 *)&verde_io_mc_regs;
1614                         regs_size = TAHITI_IO_MC_REGS_SIZE;
1615                         break;
1616                 case CHIP_OLAND:
1617                         io_mc_regs = (u32 *)&oland_io_mc_regs;
1618                         regs_size = TAHITI_IO_MC_REGS_SIZE;
1619                         break;
1620                 case CHIP_HAINAN:
1621                         io_mc_regs = (u32 *)&hainan_io_mc_regs;
1622                         regs_size = TAHITI_IO_MC_REGS_SIZE;
1623                         break;
1624                 }
1625                 fw_data = (const __be32 *)rdev->mc_fw->data;
1626         }
1627 
1628         running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1629 
1630         if (running == 0) {
1631                 /* reset the engine and set to writable */
1632                 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1633                 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1634 
1635                 /* load mc io regs */
1636                 for (i = 0; i < regs_size; i++) {
1637                         if (rdev->new_fw) {
1638                                 WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
1639                                 WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
1640                         } else {
1641                                 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1642                                 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1643                         }
1644                 }
1645                 /* load the MC ucode */
1646                 for (i = 0; i < ucode_size; i++) {
1647                         if (rdev->new_fw)
1648                                 WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
1649                         else
1650                                 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1651                 }
1652 
1653                 /* put the engine back into the active state */
1654                 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1655                 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1656                 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1657 
1658                 /* wait for training to complete */
1659                 for (i = 0; i < rdev->usec_timeout; i++) {
1660                         if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1661                                 break;
1662                         udelay(1);
1663                 }
1664                 for (i = 0; i < rdev->usec_timeout; i++) {
1665                         if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1666                                 break;
1667                         udelay(1);
1668                 }
1669         }
1670 
1671         return 0;
1672 }
1673 
1674 static int si_init_microcode(struct radeon_device *rdev)
1675 {
1676         const char *chip_name;
1677         const char *new_chip_name;
1678         size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
1679         size_t smc_req_size, mc2_req_size;
1680         char fw_name[30];
1681         int err;
1682         int new_fw = 0;
1683         bool new_smc = false;
1684         bool si58_fw = false;
1685         bool banks2_fw = false;
1686 
1687         DRM_DEBUG("\n");
1688 
1689         switch (rdev->family) {
1690         case CHIP_TAHITI:
1691                 chip_name = "TAHITI";
1692                 new_chip_name = "tahiti";
1693                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1694                 me_req_size = SI_PM4_UCODE_SIZE * 4;
1695                 ce_req_size = SI_CE_UCODE_SIZE * 4;
1696                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1697                 mc_req_size = SI_MC_UCODE_SIZE * 4;
1698                 mc2_req_size = TAHITI_MC_UCODE_SIZE * 4;
1699                 smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
1700                 break;
1701         case CHIP_PITCAIRN:
1702                 chip_name = "PITCAIRN";
1703                 if ((rdev->pdev->revision == 0x81) &&
1704                     ((rdev->pdev->device == 0x6810) ||
1705                      (rdev->pdev->device == 0x6811)))
1706                         new_smc = true;
1707                 new_chip_name = "pitcairn";
1708                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1709                 me_req_size = SI_PM4_UCODE_SIZE * 4;
1710                 ce_req_size = SI_CE_UCODE_SIZE * 4;
1711                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1712                 mc_req_size = SI_MC_UCODE_SIZE * 4;
1713                 mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4;
1714                 smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
1715                 break;
1716         case CHIP_VERDE:
1717                 chip_name = "VERDE";
1718                 if (((rdev->pdev->device == 0x6820) &&
1719                      ((rdev->pdev->revision == 0x81) ||
1720                       (rdev->pdev->revision == 0x83))) ||
1721                     ((rdev->pdev->device == 0x6821) &&
1722                      ((rdev->pdev->revision == 0x83) ||
1723                       (rdev->pdev->revision == 0x87))) ||
1724                     ((rdev->pdev->revision == 0x87) &&
1725                      ((rdev->pdev->device == 0x6823) ||
1726                       (rdev->pdev->device == 0x682b))))
1727                         new_smc = true;
1728                 new_chip_name = "verde";
1729                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1730                 me_req_size = SI_PM4_UCODE_SIZE * 4;
1731                 ce_req_size = SI_CE_UCODE_SIZE * 4;
1732                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1733                 mc_req_size = SI_MC_UCODE_SIZE * 4;
1734                 mc2_req_size = VERDE_MC_UCODE_SIZE * 4;
1735                 smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
1736                 break;
1737         case CHIP_OLAND:
1738                 chip_name = "OLAND";
1739                 if (((rdev->pdev->revision == 0x81) &&
1740                      ((rdev->pdev->device == 0x6600) ||
1741                       (rdev->pdev->device == 0x6604) ||
1742                       (rdev->pdev->device == 0x6605) ||
1743                       (rdev->pdev->device == 0x6610))) ||
1744                     ((rdev->pdev->revision == 0x83) &&
1745                      (rdev->pdev->device == 0x6610)))
1746                         new_smc = true;
1747                 new_chip_name = "oland";
1748                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1749                 me_req_size = SI_PM4_UCODE_SIZE * 4;
1750                 ce_req_size = SI_CE_UCODE_SIZE * 4;
1751                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1752                 mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
1753                 smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
1754                 break;
1755         case CHIP_HAINAN:
1756                 chip_name = "HAINAN";
1757                 if (((rdev->pdev->revision == 0x81) &&
1758                      (rdev->pdev->device == 0x6660)) ||
1759                     ((rdev->pdev->revision == 0x83) &&
1760                      ((rdev->pdev->device == 0x6660) ||
1761                       (rdev->pdev->device == 0x6663) ||
1762                       (rdev->pdev->device == 0x6665) ||
1763                       (rdev->pdev->device == 0x6667))))
1764                         new_smc = true;
1765                 else if ((rdev->pdev->revision == 0xc3) &&
1766                          (rdev->pdev->device == 0x6665))
1767                         banks2_fw = true;
1768                 new_chip_name = "hainan";
1769                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1770                 me_req_size = SI_PM4_UCODE_SIZE * 4;
1771                 ce_req_size = SI_CE_UCODE_SIZE * 4;
1772                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1773                 mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
1774                 smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
1775                 break;
1776         default: BUG();
1777         }
1778 
1779         /* this memory configuration requires special firmware */
1780         if (((RREG32(MC_SEQ_MISC0) & 0xff000000) >> 24) == 0x58)
1781                 si58_fw = true;
1782 
1783         DRM_INFO("Loading %s Microcode\n", new_chip_name);
1784 
1785         snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
1786         err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1787         if (err) {
1788                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
1789                 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1790                 if (err)
1791                         goto out;
1792                 if (rdev->pfp_fw->size != pfp_req_size) {
1793                         pr_err("si_cp: Bogus length %zu in firmware \"%s\"\n",
1794                                rdev->pfp_fw->size, fw_name);
1795                         err = -EINVAL;
1796                         goto out;
1797                 }
1798         } else {
1799                 err = radeon_ucode_validate(rdev->pfp_fw);
1800                 if (err) {
1801                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1802                                fw_name);
1803                         goto out;
1804                 } else {
1805                         new_fw++;
1806                 }
1807         }
1808 
1809         snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
1810         err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
1811         if (err) {
1812                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
1813                 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
1814                 if (err)
1815                         goto out;
1816                 if (rdev->me_fw->size != me_req_size) {
1817                         pr_err("si_cp: Bogus length %zu in firmware \"%s\"\n",
1818                                rdev->me_fw->size, fw_name);
1819                         err = -EINVAL;
1820                 }
1821         } else {
1822                 err = radeon_ucode_validate(rdev->me_fw);
1823                 if (err) {
1824                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1825                                fw_name);
1826                         goto out;
1827                 } else {
1828                         new_fw++;
1829                 }
1830         }
1831 
1832         snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
1833         err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
1834         if (err) {
1835                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
1836                 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
1837                 if (err)
1838                         goto out;
1839                 if (rdev->ce_fw->size != ce_req_size) {
1840                         pr_err("si_cp: Bogus length %zu in firmware \"%s\"\n",
1841                                rdev->ce_fw->size, fw_name);
1842                         err = -EINVAL;
1843                 }
1844         } else {
1845                 err = radeon_ucode_validate(rdev->ce_fw);
1846                 if (err) {
1847                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1848                                fw_name);
1849                         goto out;
1850                 } else {
1851                         new_fw++;
1852                 }
1853         }
1854 
1855         snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
1856         err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
1857         if (err) {
1858                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
1859                 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
1860                 if (err)
1861                         goto out;
1862                 if (rdev->rlc_fw->size != rlc_req_size) {
1863                         pr_err("si_rlc: Bogus length %zu in firmware \"%s\"\n",
1864                                rdev->rlc_fw->size, fw_name);
1865                         err = -EINVAL;
1866                 }
1867         } else {
1868                 err = radeon_ucode_validate(rdev->rlc_fw);
1869                 if (err) {
1870                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1871                                fw_name);
1872                         goto out;
1873                 } else {
1874                         new_fw++;
1875                 }
1876         }
1877 
1878         if (si58_fw)
1879                 snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
1880         else
1881                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
1882         err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
1883         if (err) {
1884                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
1885                 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
1886                 if (err) {
1887                         snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
1888                         err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
1889                         if (err)
1890                                 goto out;
1891                 }
1892                 if ((rdev->mc_fw->size != mc_req_size) &&
1893                     (rdev->mc_fw->size != mc2_req_size)) {
1894                         pr_err("si_mc: Bogus length %zu in firmware \"%s\"\n",
1895                                rdev->mc_fw->size, fw_name);
1896                         err = -EINVAL;
1897                 }
1898                 DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
1899         } else {
1900                 err = radeon_ucode_validate(rdev->mc_fw);
1901                 if (err) {
1902                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1903                                fw_name);
1904                         goto out;
1905                 } else {
1906                         new_fw++;
1907                 }
1908         }
1909 
1910         if (banks2_fw)
1911                 snprintf(fw_name, sizeof(fw_name), "radeon/banks_k_2_smc.bin");
1912         else if (new_smc)
1913                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_k_smc.bin", new_chip_name);
1914         else
1915                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
1916         err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1917         if (err) {
1918                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
1919                 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1920                 if (err) {
1921                         pr_err("smc: error loading firmware \"%s\"\n", fw_name);
1922                         release_firmware(rdev->smc_fw);
1923                         rdev->smc_fw = NULL;
1924                         err = 0;
1925                 } else if (rdev->smc_fw->size != smc_req_size) {
1926                         pr_err("si_smc: Bogus length %zu in firmware \"%s\"\n",
1927                                rdev->smc_fw->size, fw_name);
1928                         err = -EINVAL;
1929                 }
1930         } else {
1931                 err = radeon_ucode_validate(rdev->smc_fw);
1932                 if (err) {
1933                         pr_err("si_cp: validation failed for firmware \"%s\"\n",
1934                                fw_name);
1935                         goto out;
1936                 } else {
1937                         new_fw++;
1938                 }
1939         }
1940 
1941         if (new_fw == 0) {
1942                 rdev->new_fw = false;
1943         } else if (new_fw < 6) {
1944                 pr_err("si_fw: mixing new and old firmware!\n");
1945                 err = -EINVAL;
1946         } else {
1947                 rdev->new_fw = true;
1948         }
1949 out:
1950         if (err) {
1951                 if (err != -EINVAL)
1952                         pr_err("si_cp: Failed to load firmware \"%s\"\n",
1953                                fw_name);
1954                 release_firmware(rdev->pfp_fw);
1955                 rdev->pfp_fw = NULL;
1956                 release_firmware(rdev->me_fw);
1957                 rdev->me_fw = NULL;
1958                 release_firmware(rdev->ce_fw);
1959                 rdev->ce_fw = NULL;
1960                 release_firmware(rdev->rlc_fw);
1961                 rdev->rlc_fw = NULL;
1962                 release_firmware(rdev->mc_fw);
1963                 rdev->mc_fw = NULL;
1964                 release_firmware(rdev->smc_fw);
1965                 rdev->smc_fw = NULL;
1966         }
1967         return err;
1968 }
1969 
1970 /* watermark setup */
1971 static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
1972                                    struct radeon_crtc *radeon_crtc,
1973                                    struct drm_display_mode *mode,
1974                                    struct drm_display_mode *other_mode)
1975 {
1976         u32 tmp, buffer_alloc, i;
1977         u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1978         /*
1979          * Line Buffer Setup
1980          * There are 3 line buffers, each one shared by 2 display controllers.
1981          * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1982          * the display controllers.  The paritioning is done via one of four
1983          * preset allocations specified in bits 21:20:
1984          *  0 - half lb
1985          *  2 - whole lb, other crtc must be disabled
1986          */
1987         /* this can get tricky if we have two large displays on a paired group
1988          * of crtcs.  Ideally for multiple large displays we'd assign them to
1989          * non-linked crtcs for maximum line buffer allocation.
1990          */
1991         if (radeon_crtc->base.enabled && mode) {
1992                 if (other_mode) {
1993                         tmp = 0; /* 1/2 */
1994                         buffer_alloc = 1;
1995                 } else {
1996                         tmp = 2; /* whole */
1997                         buffer_alloc = 2;
1998                 }
1999         } else {
2000                 tmp = 0;
2001                 buffer_alloc = 0;
2002         }
2003 
2004         WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset,
2005                DC_LB_MEMORY_CONFIG(tmp));
2006 
2007         WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
2008                DMIF_BUFFERS_ALLOCATED(buffer_alloc));
2009         for (i = 0; i < rdev->usec_timeout; i++) {
2010                 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
2011                     DMIF_BUFFERS_ALLOCATED_COMPLETED)
2012                         break;
2013                 udelay(1);
2014         }
2015 
2016         if (radeon_crtc->base.enabled && mode) {
2017                 switch (tmp) {
2018                 case 0:
2019                 default:
2020                         return 4096 * 2;
2021                 case 2:
2022                         return 8192 * 2;
2023                 }
2024         }
2025 
2026         /* controller not enabled, so no lb used */
2027         return 0;
2028 }
2029 
2030 static u32 si_get_number_of_dram_channels(struct radeon_device *rdev)
2031 {
2032         u32 tmp = RREG32(MC_SHARED_CHMAP);
2033 
2034         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
2035         case 0:
2036         default:
2037                 return 1;
2038         case 1:
2039                 return 2;
2040         case 2:
2041                 return 4;
2042         case 3:
2043                 return 8;
2044         case 4:
2045                 return 3;
2046         case 5:
2047                 return 6;
2048         case 6:
2049                 return 10;
2050         case 7:
2051                 return 12;
2052         case 8:
2053                 return 16;
2054         }
2055 }
2056 
2057 struct dce6_wm_params {
2058         u32 dram_channels; /* number of dram channels */
2059         u32 yclk;          /* bandwidth per dram data pin in kHz */
2060         u32 sclk;          /* engine clock in kHz */
2061         u32 disp_clk;      /* display clock in kHz */
2062         u32 src_width;     /* viewport width */
2063         u32 active_time;   /* active display time in ns */
2064         u32 blank_time;    /* blank time in ns */
2065         bool interlaced;    /* mode is interlaced */
2066         fixed20_12 vsc;    /* vertical scale ratio */
2067         u32 num_heads;     /* number of active crtcs */
2068         u32 bytes_per_pixel; /* bytes per pixel display + overlay */
2069         u32 lb_size;       /* line buffer allocated to pipe */
2070         u32 vtaps;         /* vertical scaler taps */
2071 };
2072 
2073 static u32 dce6_dram_bandwidth(struct dce6_wm_params *wm)
2074 {
2075         /* Calculate raw DRAM Bandwidth */
2076         fixed20_12 dram_efficiency; /* 0.7 */
2077         fixed20_12 yclk, dram_channels, bandwidth;
2078         fixed20_12 a;
2079 
2080         a.full = dfixed_const(1000);
2081         yclk.full = dfixed_const(wm->yclk);
2082         yclk.full = dfixed_div(yclk, a);
2083         dram_channels.full = dfixed_const(wm->dram_channels * 4);
2084         a.full = dfixed_const(10);
2085         dram_efficiency.full = dfixed_const(7);
2086         dram_efficiency.full = dfixed_div(dram_efficiency, a);
2087         bandwidth.full = dfixed_mul(dram_channels, yclk);
2088         bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
2089 
2090         return dfixed_trunc(bandwidth);
2091 }
2092 
2093 static u32 dce6_dram_bandwidth_for_display(struct dce6_wm_params *wm)
2094 {
2095         /* Calculate DRAM Bandwidth and the part allocated to display. */
2096         fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
2097         fixed20_12 yclk, dram_channels, bandwidth;
2098         fixed20_12 a;
2099 
2100         a.full = dfixed_const(1000);
2101         yclk.full = dfixed_const(wm->yclk);
2102         yclk.full = dfixed_div(yclk, a);
2103         dram_channels.full = dfixed_const(wm->dram_channels * 4);
2104         a.full = dfixed_const(10);
2105         disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
2106         disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
2107         bandwidth.full = dfixed_mul(dram_channels, yclk);
2108         bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
2109 
2110         return dfixed_trunc(bandwidth);
2111 }
2112 
2113 static u32 dce6_data_return_bandwidth(struct dce6_wm_params *wm)
2114 {
2115         /* Calculate the display Data return Bandwidth */
2116         fixed20_12 return_efficiency; /* 0.8 */
2117         fixed20_12 sclk, bandwidth;
2118         fixed20_12 a;
2119 
2120         a.full = dfixed_const(1000);
2121         sclk.full = dfixed_const(wm->sclk);
2122         sclk.full = dfixed_div(sclk, a);
2123         a.full = dfixed_const(10);
2124         return_efficiency.full = dfixed_const(8);
2125         return_efficiency.full = dfixed_div(return_efficiency, a);
2126         a.full = dfixed_const(32);
2127         bandwidth.full = dfixed_mul(a, sclk);
2128         bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
2129 
2130         return dfixed_trunc(bandwidth);
2131 }
2132 
2133 static u32 dce6_get_dmif_bytes_per_request(struct dce6_wm_params *wm)
2134 {
2135         return 32;
2136 }
2137 
2138 static u32 dce6_dmif_request_bandwidth(struct dce6_wm_params *wm)
2139 {
2140         /* Calculate the DMIF Request Bandwidth */
2141         fixed20_12 disp_clk_request_efficiency; /* 0.8 */
2142         fixed20_12 disp_clk, sclk, bandwidth;
2143         fixed20_12 a, b1, b2;
2144         u32 min_bandwidth;
2145 
2146         a.full = dfixed_const(1000);
2147         disp_clk.full = dfixed_const(wm->disp_clk);
2148         disp_clk.full = dfixed_div(disp_clk, a);
2149         a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm) / 2);
2150         b1.full = dfixed_mul(a, disp_clk);
2151 
2152         a.full = dfixed_const(1000);
2153         sclk.full = dfixed_const(wm->sclk);
2154         sclk.full = dfixed_div(sclk, a);
2155         a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm));
2156         b2.full = dfixed_mul(a, sclk);
2157 
2158         a.full = dfixed_const(10);
2159         disp_clk_request_efficiency.full = dfixed_const(8);
2160         disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
2161 
2162         min_bandwidth = min(dfixed_trunc(b1), dfixed_trunc(b2));
2163 
2164         a.full = dfixed_const(min_bandwidth);
2165         bandwidth.full = dfixed_mul(a, disp_clk_request_efficiency);
2166 
2167         return dfixed_trunc(bandwidth);
2168 }
2169 
2170 static u32 dce6_available_bandwidth(struct dce6_wm_params *wm)
2171 {
2172         /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
2173         u32 dram_bandwidth = dce6_dram_bandwidth(wm);
2174         u32 data_return_bandwidth = dce6_data_return_bandwidth(wm);
2175         u32 dmif_req_bandwidth = dce6_dmif_request_bandwidth(wm);
2176 
2177         return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
2178 }
2179 
2180 static u32 dce6_average_bandwidth(struct dce6_wm_params *wm)
2181 {
2182         /* Calculate the display mode Average Bandwidth
2183          * DisplayMode should contain the source and destination dimensions,
2184          * timing, etc.
2185          */
2186         fixed20_12 bpp;
2187         fixed20_12 line_time;
2188         fixed20_12 src_width;
2189         fixed20_12 bandwidth;
2190         fixed20_12 a;
2191 
2192         a.full = dfixed_const(1000);
2193         line_time.full = dfixed_const(wm->active_time + wm->blank_time);
2194         line_time.full = dfixed_div(line_time, a);
2195         bpp.full = dfixed_const(wm->bytes_per_pixel);
2196         src_width.full = dfixed_const(wm->src_width);
2197         bandwidth.full = dfixed_mul(src_width, bpp);
2198         bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
2199         bandwidth.full = dfixed_div(bandwidth, line_time);
2200 
2201         return dfixed_trunc(bandwidth);
2202 }
2203 
2204 static u32 dce6_latency_watermark(struct dce6_wm_params *wm)
2205 {
2206         /* First calcualte the latency in ns */
2207         u32 mc_latency = 2000; /* 2000 ns. */
2208         u32 available_bandwidth = dce6_available_bandwidth(wm);
2209         u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
2210         u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
2211         u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
2212         u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
2213                 (wm->num_heads * cursor_line_pair_return_time);
2214         u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
2215         u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
2216         u32 tmp, dmif_size = 12288;
2217         fixed20_12 a, b, c;
2218 
2219         if (wm->num_heads == 0)
2220                 return 0;
2221 
2222         a.full = dfixed_const(2);
2223         b.full = dfixed_const(1);
2224         if ((wm->vsc.full > a.full) ||
2225             ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
2226             (wm->vtaps >= 5) ||
2227             ((wm->vsc.full >= a.full) && wm->interlaced))
2228                 max_src_lines_per_dst_line = 4;
2229         else
2230                 max_src_lines_per_dst_line = 2;
2231 
2232         a.full = dfixed_const(available_bandwidth);
2233         b.full = dfixed_const(wm->num_heads);
2234         a.full = dfixed_div(a, b);
2235         tmp = div_u64((u64) dmif_size * (u64) wm->disp_clk, mc_latency + 512);
2236         tmp = min(dfixed_trunc(a), tmp);
2237 
2238         lb_fill_bw = min(tmp, wm->disp_clk * wm->bytes_per_pixel / 1000);
2239 
2240         a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2241         b.full = dfixed_const(1000);
2242         c.full = dfixed_const(lb_fill_bw);
2243         b.full = dfixed_div(c, b);
2244         a.full = dfixed_div(a, b);
2245         line_fill_time = dfixed_trunc(a);
2246 
2247         if (line_fill_time < wm->active_time)
2248                 return latency;
2249         else
2250                 return latency + (line_fill_time - wm->active_time);
2251 
2252 }
2253 
2254 static bool dce6_average_bandwidth_vs_dram_bandwidth_for_display(struct dce6_wm_params *wm)
2255 {
2256         if (dce6_average_bandwidth(wm) <=
2257             (dce6_dram_bandwidth_for_display(wm) / wm->num_heads))
2258                 return true;
2259         else
2260                 return false;
2261 };
2262 
2263 static bool dce6_average_bandwidth_vs_available_bandwidth(struct dce6_wm_params *wm)
2264 {
2265         if (dce6_average_bandwidth(wm) <=
2266             (dce6_available_bandwidth(wm) / wm->num_heads))
2267                 return true;
2268         else
2269                 return false;
2270 };
2271 
2272 static bool dce6_check_latency_hiding(struct dce6_wm_params *wm)
2273 {
2274         u32 lb_partitions = wm->lb_size / wm->src_width;
2275         u32 line_time = wm->active_time + wm->blank_time;
2276         u32 latency_tolerant_lines;
2277         u32 latency_hiding;
2278         fixed20_12 a;
2279 
2280         a.full = dfixed_const(1);
2281         if (wm->vsc.full > a.full)
2282                 latency_tolerant_lines = 1;
2283         else {
2284                 if (lb_partitions <= (wm->vtaps + 1))
2285                         latency_tolerant_lines = 1;
2286                 else
2287                         latency_tolerant_lines = 2;
2288         }
2289 
2290         latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2291 
2292         if (dce6_latency_watermark(wm) <= latency_hiding)
2293                 return true;
2294         else
2295                 return false;
2296 }
2297 
2298 static void dce6_program_watermarks(struct radeon_device *rdev,
2299                                          struct radeon_crtc *radeon_crtc,
2300                                          u32 lb_size, u32 num_heads)
2301 {
2302         struct drm_display_mode *mode = &radeon_crtc->base.mode;
2303         struct dce6_wm_params wm_low, wm_high;
2304         u32 dram_channels;
2305         u32 active_time;
2306         u32 line_time = 0;
2307         u32 latency_watermark_a = 0, latency_watermark_b = 0;
2308         u32 priority_a_mark = 0, priority_b_mark = 0;
2309         u32 priority_a_cnt = PRIORITY_OFF;
2310         u32 priority_b_cnt = PRIORITY_OFF;
2311         u32 tmp, arb_control3;
2312         fixed20_12 a, b, c;
2313 
2314         if (radeon_crtc->base.enabled && num_heads && mode) {
2315                 active_time = (u32) div_u64((u64)mode->crtc_hdisplay * 1000000,
2316                                             (u32)mode->clock);
2317                 line_time = (u32) div_u64((u64)mode->crtc_htotal * 1000000,
2318                                           (u32)mode->clock);
2319                 line_time = min(line_time, (u32)65535);
2320                 priority_a_cnt = 0;
2321                 priority_b_cnt = 0;
2322 
2323                 if (rdev->family == CHIP_ARUBA)
2324                         dram_channels = evergreen_get_number_of_dram_channels(rdev);
2325                 else
2326                         dram_channels = si_get_number_of_dram_channels(rdev);
2327 
2328                 /* watermark for high clocks */
2329                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2330                         wm_high.yclk =
2331                                 radeon_dpm_get_mclk(rdev, false) * 10;
2332                         wm_high.sclk =
2333                                 radeon_dpm_get_sclk(rdev, false) * 10;
2334                 } else {
2335                         wm_high.yclk = rdev->pm.current_mclk * 10;
2336                         wm_high.sclk = rdev->pm.current_sclk * 10;
2337                 }
2338 
2339                 wm_high.disp_clk = mode->clock;
2340                 wm_high.src_width = mode->crtc_hdisplay;
2341                 wm_high.active_time = active_time;
2342                 wm_high.blank_time = line_time - wm_high.active_time;
2343                 wm_high.interlaced = false;
2344                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2345                         wm_high.interlaced = true;
2346                 wm_high.vsc = radeon_crtc->vsc;
2347                 wm_high.vtaps = 1;
2348                 if (radeon_crtc->rmx_type != RMX_OFF)
2349                         wm_high.vtaps = 2;
2350                 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2351                 wm_high.lb_size = lb_size;
2352                 wm_high.dram_channels = dram_channels;
2353                 wm_high.num_heads = num_heads;
2354 
2355                 /* watermark for low clocks */
2356                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2357                         wm_low.yclk =
2358                                 radeon_dpm_get_mclk(rdev, true) * 10;
2359                         wm_low.sclk =
2360                                 radeon_dpm_get_sclk(rdev, true) * 10;
2361                 } else {
2362                         wm_low.yclk = rdev->pm.current_mclk * 10;
2363                         wm_low.sclk = rdev->pm.current_sclk * 10;
2364                 }
2365 
2366                 wm_low.disp_clk = mode->clock;
2367                 wm_low.src_width = mode->crtc_hdisplay;
2368                 wm_low.active_time = active_time;
2369                 wm_low.blank_time = line_time - wm_low.active_time;
2370                 wm_low.interlaced = false;
2371                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2372                         wm_low.interlaced = true;
2373                 wm_low.vsc = radeon_crtc->vsc;
2374                 wm_low.vtaps = 1;
2375                 if (radeon_crtc->rmx_type != RMX_OFF)
2376                         wm_low.vtaps = 2;
2377                 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2378                 wm_low.lb_size = lb_size;
2379                 wm_low.dram_channels = dram_channels;
2380                 wm_low.num_heads = num_heads;
2381 
2382                 /* set for high clocks */
2383                 latency_watermark_a = min(dce6_latency_watermark(&wm_high), (u32)65535);
2384                 /* set for low clocks */
2385                 latency_watermark_b = min(dce6_latency_watermark(&wm_low), (u32)65535);
2386 
2387                 /* possibly force display priority to high */
2388                 /* should really do this at mode validation time... */
2389                 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2390                     !dce6_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2391                     !dce6_check_latency_hiding(&wm_high) ||
2392                     (rdev->disp_priority == 2)) {
2393                         DRM_DEBUG_KMS("force priority to high\n");
2394                         priority_a_cnt |= PRIORITY_ALWAYS_ON;
2395                         priority_b_cnt |= PRIORITY_ALWAYS_ON;
2396                 }
2397                 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2398                     !dce6_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2399                     !dce6_check_latency_hiding(&wm_low) ||
2400                     (rdev->disp_priority == 2)) {
2401                         DRM_DEBUG_KMS("force priority to high\n");
2402                         priority_a_cnt |= PRIORITY_ALWAYS_ON;
2403                         priority_b_cnt |= PRIORITY_ALWAYS_ON;
2404                 }
2405 
2406                 a.full = dfixed_const(1000);
2407                 b.full = dfixed_const(mode->clock);
2408                 b.full = dfixed_div(b, a);
2409                 c.full = dfixed_const(latency_watermark_a);
2410                 c.full = dfixed_mul(c, b);
2411                 c.full = dfixed_mul(c, radeon_crtc->hsc);
2412                 c.full = dfixed_div(c, a);
2413                 a.full = dfixed_const(16);
2414                 c.full = dfixed_div(c, a);
2415                 priority_a_mark = dfixed_trunc(c);
2416                 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2417 
2418                 a.full = dfixed_const(1000);
2419                 b.full = dfixed_const(mode->clock);
2420                 b.full = dfixed_div(b, a);
2421                 c.full = dfixed_const(latency_watermark_b);
2422                 c.full = dfixed_mul(c, b);
2423                 c.full = dfixed_mul(c, radeon_crtc->hsc);
2424                 c.full = dfixed_div(c, a);
2425                 a.full = dfixed_const(16);
2426                 c.full = dfixed_div(c, a);
2427                 priority_b_mark = dfixed_trunc(c);
2428                 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2429 
2430                 /* Save number of lines the linebuffer leads before the scanout */
2431                 radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
2432         }
2433 
2434         /* select wm A */
2435         arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
2436         tmp = arb_control3;
2437         tmp &= ~LATENCY_WATERMARK_MASK(3);
2438         tmp |= LATENCY_WATERMARK_MASK(1);
2439         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
2440         WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
2441                (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2442                 LATENCY_HIGH_WATERMARK(line_time)));
2443         /* select wm B */
2444         tmp = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
2445         tmp &= ~LATENCY_WATERMARK_MASK(3);
2446         tmp |= LATENCY_WATERMARK_MASK(2);
2447         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
2448         WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
2449                (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2450                 LATENCY_HIGH_WATERMARK(line_time)));
2451         /* restore original selection */
2452         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, arb_control3);
2453 
2454         /* write the priority marks */
2455         WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2456         WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2457 
2458         /* save values for DPM */
2459         radeon_crtc->line_time = line_time;
2460         radeon_crtc->wm_high = latency_watermark_a;
2461         radeon_crtc->wm_low = latency_watermark_b;
2462 }
2463 
2464 void dce6_bandwidth_update(struct radeon_device *rdev)
2465 {
2466         struct drm_display_mode *mode0 = NULL;
2467         struct drm_display_mode *mode1 = NULL;
2468         u32 num_heads = 0, lb_size;
2469         int i;
2470 
2471         if (!rdev->mode_info.mode_config_initialized)
2472                 return;
2473 
2474         radeon_update_display_priority(rdev);
2475 
2476         for (i = 0; i < rdev->num_crtc; i++) {
2477                 if (rdev->mode_info.crtcs[i]->base.enabled)
2478                         num_heads++;
2479         }
2480         for (i = 0; i < rdev->num_crtc; i += 2) {
2481                 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2482                 mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2483                 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2484                 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2485                 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2486                 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2487         }
2488 }
2489 
2490 /*
2491  * Core functions
2492  */
2493 static void si_tiling_mode_table_init(struct radeon_device *rdev)
2494 {
2495         u32 *tile = rdev->config.si.tile_mode_array;
2496         const u32 num_tile_mode_states =
2497                         ARRAY_SIZE(rdev->config.si.tile_mode_array);
2498         u32 reg_offset, split_equal_to_row_size;
2499 
2500         switch (rdev->config.si.mem_row_size_in_kb) {
2501         case 1:
2502                 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
2503                 break;
2504         case 2:
2505         default:
2506                 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
2507                 break;
2508         case 4:
2509                 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
2510                 break;
2511         }
2512 
2513         for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2514                 tile[reg_offset] = 0;
2515 
2516         switch(rdev->family) {
2517         case CHIP_TAHITI:
2518         case CHIP_PITCAIRN:
2519                 /* non-AA compressed depth or any compressed stencil */
2520                 tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2521                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2522                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2523                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2524                            NUM_BANKS(ADDR_SURF_16_BANK) |
2525                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2526                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2527                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2528                 /* 2xAA/4xAA compressed depth only */
2529                 tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2530                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2531                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2532                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2533                            NUM_BANKS(ADDR_SURF_16_BANK) |
2534                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2535                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2536                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2537                 /* 8xAA compressed depth only */
2538                 tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2539                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2540                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2541                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2542                            NUM_BANKS(ADDR_SURF_16_BANK) |
2543                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2544                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2545                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2546                 /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
2547                 tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2548                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2549                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2550                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2551                            NUM_BANKS(ADDR_SURF_16_BANK) |
2552                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2553                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2554                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2555                 /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
2556                 tile[4] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2557                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2558                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2559                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2560                            NUM_BANKS(ADDR_SURF_16_BANK) |
2561                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2562                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2563                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2564                 /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
2565                 tile[5] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2566                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2567                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2568                            TILE_SPLIT(split_equal_to_row_size) |
2569                            NUM_BANKS(ADDR_SURF_16_BANK) |
2570                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2571                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2572                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2573                 /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
2574                 tile[6] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2575                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2576                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2577                            TILE_SPLIT(split_equal_to_row_size) |
2578                            NUM_BANKS(ADDR_SURF_16_BANK) |
2579                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2580                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2581                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2582                 /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
2583                 tile[7] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2584                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2585                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2586                            TILE_SPLIT(split_equal_to_row_size) |
2587                            NUM_BANKS(ADDR_SURF_16_BANK) |
2588                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2589                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2590                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2591                 /* 1D and 1D Array Surfaces */
2592                 tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2593                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2594                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2595                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2596                            NUM_BANKS(ADDR_SURF_16_BANK) |
2597                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2598                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2599                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2600                 /* Displayable maps. */
2601                 tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2602                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2603                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2604                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2605                            NUM_BANKS(ADDR_SURF_16_BANK) |
2606                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2607                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2608                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2609                 /* Display 8bpp. */
2610                 tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2611                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2612                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2613                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2614                            NUM_BANKS(ADDR_SURF_16_BANK) |
2615                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2616                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2617                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2618                 /* Display 16bpp. */
2619                 tile[11] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2620                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2621                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2622                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2623                            NUM_BANKS(ADDR_SURF_16_BANK) |
2624                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2625                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2626                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2627                 /* Display 32bpp. */
2628                 tile[12] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2629                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2630                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2631                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2632                            NUM_BANKS(ADDR_SURF_16_BANK) |
2633                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2634                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2635                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2636                 /* Thin. */
2637                 tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2638                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2639                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2640                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2641                            NUM_BANKS(ADDR_SURF_16_BANK) |
2642                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2643                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2644                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2645                 /* Thin 8 bpp. */
2646                 tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2647                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2648                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2649                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2650                            NUM_BANKS(ADDR_SURF_16_BANK) |
2651                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2652                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2653                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2654                 /* Thin 16 bpp. */
2655                 tile[15] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2656                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2657                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2658                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2659                            NUM_BANKS(ADDR_SURF_16_BANK) |
2660                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2661                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2662                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2663                 /* Thin 32 bpp. */
2664                 tile[16] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2665                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2666                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2667                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2668                            NUM_BANKS(ADDR_SURF_16_BANK) |
2669                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2670                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2671                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2672                 /* Thin 64 bpp. */
2673                 tile[17] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2674                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2675                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2676                            TILE_SPLIT(split_equal_to_row_size) |
2677                            NUM_BANKS(ADDR_SURF_16_BANK) |
2678                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2679                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2680                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2681                 /* 8 bpp PRT. */
2682                 tile[21] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2683                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2684                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2685                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2686                            NUM_BANKS(ADDR_SURF_16_BANK) |
2687                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2688                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2689                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2690                 /* 16 bpp PRT */
2691                 tile[22] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2692                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2693                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2694                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2695                            NUM_BANKS(ADDR_SURF_16_BANK) |
2696                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2697                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2698                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2699                 /* 32 bpp PRT */
2700                 tile[23] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2701                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2702                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2703                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2704                            NUM_BANKS(ADDR_SURF_16_BANK) |
2705                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2706                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2707                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2708                 /* 64 bpp PRT */
2709                 tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2710                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2711                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2712                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2713                            NUM_BANKS(ADDR_SURF_16_BANK) |
2714                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2715                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2716                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2717                 /* 128 bpp PRT */
2718                 tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2719                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2720                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2721                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
2722                            NUM_BANKS(ADDR_SURF_8_BANK) |
2723                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2724                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2725                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2726 
2727                 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2728                         WREG32(GB_TILE_MODE0 + (reg_offset * 4), tile[reg_offset]);
2729                 break;
2730 
2731         case CHIP_VERDE:
2732         case CHIP_OLAND:
2733         case CHIP_HAINAN:
2734                 /* non-AA compressed depth or any compressed stencil */
2735                 tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2736                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2737                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2738                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2739                            NUM_BANKS(ADDR_SURF_16_BANK) |
2740                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2741                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2742                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2743                 /* 2xAA/4xAA compressed depth only */
2744                 tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2745                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2746                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2747                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2748                            NUM_BANKS(ADDR_SURF_16_BANK) |
2749                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2750                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2751                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2752                 /* 8xAA compressed depth only */
2753                 tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2754                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2755                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2756                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2757                            NUM_BANKS(ADDR_SURF_16_BANK) |
2758                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2759                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2760                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2761                 /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
2762                 tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2763                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2764                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2765                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2766                            NUM_BANKS(ADDR_SURF_16_BANK) |
2767                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2768                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2769                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2770                 /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
2771                 tile[4] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2772                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2773                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2774                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2775                            NUM_BANKS(ADDR_SURF_16_BANK) |
2776                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2777                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2778                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2779                 /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
2780                 tile[5] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2781                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2782                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2783                            TILE_SPLIT(split_equal_to_row_size) |
2784                            NUM_BANKS(ADDR_SURF_16_BANK) |
2785                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2786                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2787                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2788                 /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
2789                 tile[6] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2790                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2791                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2792                            TILE_SPLIT(split_equal_to_row_size) |
2793                            NUM_BANKS(ADDR_SURF_16_BANK) |
2794                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2795                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2796                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2797                 /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
2798                 tile[7] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2799                            MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2800                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2801                            TILE_SPLIT(split_equal_to_row_size) |
2802                            NUM_BANKS(ADDR_SURF_16_BANK) |
2803                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2804                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2805                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2806                 /* 1D and 1D Array Surfaces */
2807                 tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2808                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2809                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2810                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2811                            NUM_BANKS(ADDR_SURF_16_BANK) |
2812                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2813                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2814                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2815                 /* Displayable maps. */
2816                 tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2817                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2818                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2819                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2820                            NUM_BANKS(ADDR_SURF_16_BANK) |
2821                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2822                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2823                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2824                 /* Display 8bpp. */
2825                 tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2826                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2827                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2828                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2829                            NUM_BANKS(ADDR_SURF_16_BANK) |
2830                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2831                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2832                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2833                 /* Display 16bpp. */
2834                 tile[11] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2835                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2836                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2837                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2838                            NUM_BANKS(ADDR_SURF_16_BANK) |
2839                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2840                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2841                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2842                 /* Display 32bpp. */
2843                 tile[12] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2844                            MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2845                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2846                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2847                            NUM_BANKS(ADDR_SURF_16_BANK) |
2848                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2849                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2850                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2851                 /* Thin. */
2852                 tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2853                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2854                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2855                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2856                            NUM_BANKS(ADDR_SURF_16_BANK) |
2857                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2858                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2859                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2860                 /* Thin 8 bpp. */
2861                 tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2862                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2863                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2864                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2865                            NUM_BANKS(ADDR_SURF_16_BANK) |
2866                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2867                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2868                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2869                 /* Thin 16 bpp. */
2870                 tile[15] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2871                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2872                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2873                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2874                            NUM_BANKS(ADDR_SURF_16_BANK) |
2875                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2876                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2877                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2878                 /* Thin 32 bpp. */
2879                 tile[16] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2880                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2881                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2882                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2883                            NUM_BANKS(ADDR_SURF_16_BANK) |
2884                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2885                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2886                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2887                 /* Thin 64 bpp. */
2888                 tile[17] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2889                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2890                            PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2891                            TILE_SPLIT(split_equal_to_row_size) |
2892                            NUM_BANKS(ADDR_SURF_16_BANK) |
2893                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2894                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2895                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2896                 /* 8 bpp PRT. */
2897                 tile[21] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2898                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2899                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2900                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2901                            NUM_BANKS(ADDR_SURF_16_BANK) |
2902                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2903                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2904                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2905                 /* 16 bpp PRT */
2906                 tile[22] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2907                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2908                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2909                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2910                            NUM_BANKS(ADDR_SURF_16_BANK) |
2911                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2912                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2913                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2914                 /* 32 bpp PRT */
2915                 tile[23] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2916                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2917                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2918                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2919                            NUM_BANKS(ADDR_SURF_16_BANK) |
2920                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2921                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2922                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2923                 /* 64 bpp PRT */
2924                 tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2925                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2926                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2927                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2928                            NUM_BANKS(ADDR_SURF_16_BANK) |
2929                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2930                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2931                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2932                 /* 128 bpp PRT */
2933                 tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2934                            MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2935                            PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2936                            TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
2937                            NUM_BANKS(ADDR_SURF_8_BANK) |
2938                            BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2939                            BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2940                            MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2941 
2942                 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2943                         WREG32(GB_TILE_MODE0 + (reg_offset * 4), tile[reg_offset]);
2944                 break;
2945 
2946         default:
2947                 DRM_ERROR("unknown asic: 0x%x\n", rdev->family);
2948         }
2949 }
2950 
2951 static void si_select_se_sh(struct radeon_device *rdev,
2952                             u32 se_num, u32 sh_num)
2953 {
2954         u32 data = INSTANCE_BROADCAST_WRITES;
2955 
2956         if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
2957                 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
2958         else if (se_num == 0xffffffff)
2959                 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
2960         else if (sh_num == 0xffffffff)
2961                 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
2962         else
2963                 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
2964         WREG32(GRBM_GFX_INDEX, data);
2965 }
2966 
2967 static u32 si_create_bitmask(u32 bit_width)
2968 {
2969         u32 i, mask = 0;
2970 
2971         for (i = 0; i < bit_width; i++) {
2972                 mask <<= 1;
2973                 mask |= 1;
2974         }
2975         return mask;
2976 }
2977 
2978 static u32 si_get_cu_enabled(struct radeon_device *rdev, u32 cu_per_sh)
2979 {
2980         u32 data, mask;
2981 
2982         data = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
2983         if (data & 1)
2984                 data &= INACTIVE_CUS_MASK;
2985         else
2986                 data = 0;
2987         data |= RREG32(GC_USER_SHADER_ARRAY_CONFIG);
2988 
2989         data >>= INACTIVE_CUS_SHIFT;
2990 
2991         mask = si_create_bitmask(cu_per_sh);
2992 
2993         return ~data & mask;
2994 }
2995 
2996 static void si_setup_spi(struct radeon_device *rdev,
2997                          u32 se_num, u32 sh_per_se,
2998                          u32 cu_per_sh)
2999 {
3000         int i, j, k;
3001         u32 data, mask, active_cu;
3002 
3003         for (i = 0; i < se_num; i++) {
3004                 for (j = 0; j < sh_per_se; j++) {
3005                         si_select_se_sh(rdev, i, j);
3006                         data = RREG32(SPI_STATIC_THREAD_MGMT_3);
3007                         active_cu = si_get_cu_enabled(rdev, cu_per_sh);
3008 
3009                         mask = 1;
3010                         for (k = 0; k < 16; k++) {
3011                                 mask <<= k;
3012                                 if (active_cu & mask) {
3013                                         data &= ~mask;
3014                                         WREG32(SPI_STATIC_THREAD_MGMT_3, data);
3015                                         break;
3016                                 }
3017                         }
3018                 }
3019         }
3020         si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3021 }
3022 
3023 static u32 si_get_rb_disabled(struct radeon_device *rdev,
3024                               u32 max_rb_num_per_se,
3025                               u32 sh_per_se)
3026 {
3027         u32 data, mask;
3028 
3029         data = RREG32(CC_RB_BACKEND_DISABLE);
3030         if (data & 1)
3031                 data &= BACKEND_DISABLE_MASK;
3032         else
3033                 data = 0;
3034         data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
3035 
3036         data >>= BACKEND_DISABLE_SHIFT;
3037 
3038         mask = si_create_bitmask(max_rb_num_per_se / sh_per_se);
3039 
3040         return data & mask;
3041 }
3042 
3043 static void si_setup_rb(struct radeon_device *rdev,
3044                         u32 se_num, u32 sh_per_se,
3045                         u32 max_rb_num_per_se)
3046 {
3047         int i, j;
3048         u32 data, mask;
3049         u32 disabled_rbs = 0;
3050         u32 enabled_rbs = 0;
3051 
3052         for (i = 0; i < se_num; i++) {
3053                 for (j = 0; j < sh_per_se; j++) {
3054                         si_select_se_sh(rdev, i, j);
3055                         data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
3056                         disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
3057                 }
3058         }
3059         si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3060 
3061         mask = 1;
3062         for (i = 0; i < max_rb_num_per_se * se_num; i++) {
3063                 if (!(disabled_rbs & mask))
3064                         enabled_rbs |= mask;
3065                 mask <<= 1;
3066         }
3067 
3068         rdev->config.si.backend_enable_mask = enabled_rbs;
3069 
3070         for (i = 0; i < se_num; i++) {
3071                 si_select_se_sh(rdev, i, 0xffffffff);
3072                 data = 0;
3073                 for (j = 0; j < sh_per_se; j++) {
3074                         switch (enabled_rbs & 3) {
3075                         case 1:
3076                                 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
3077                                 break;
3078                         case 2:
3079                                 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
3080                                 break;
3081                         case 3:
3082                         default:
3083                                 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
3084                                 break;
3085                         }
3086                         enabled_rbs >>= 2;
3087                 }
3088                 WREG32(PA_SC_RASTER_CONFIG, data);
3089         }
3090         si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3091 }
3092 
3093 static void si_gpu_init(struct radeon_device *rdev)
3094 {
3095         u32 gb_addr_config = 0;
3096         u32 mc_shared_chmap, mc_arb_ramcfg;
3097         u32 sx_debug_1;
3098         u32 hdp_host_path_cntl;
3099         u32 tmp;
3100         int i, j;
3101 
3102         switch (rdev->family) {
3103         case CHIP_TAHITI:
3104                 rdev->config.si.max_shader_engines = 2;
3105                 rdev->config.si.max_tile_pipes = 12;
3106                 rdev->config.si.max_cu_per_sh = 8;
3107                 rdev->config.si.max_sh_per_se = 2;
3108                 rdev->config.si.max_backends_per_se = 4;
3109                 rdev->config.si.max_texture_channel_caches = 12;
3110                 rdev->config.si.max_gprs = 256;
3111                 rdev->config.si.max_gs_threads = 32;
3112                 rdev->config.si.max_hw_contexts = 8;
3113 
3114                 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
3115                 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
3116                 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
3117                 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
3118                 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
3119                 break;
3120         case CHIP_PITCAIRN:
3121                 rdev->config.si.max_shader_engines = 2;
3122                 rdev->config.si.max_tile_pipes = 8;
3123                 rdev->config.si.max_cu_per_sh = 5;
3124                 rdev->config.si.max_sh_per_se = 2;
3125                 rdev->config.si.max_backends_per_se = 4;
3126                 rdev->config.si.max_texture_channel_caches = 8;
3127                 rdev->config.si.max_gprs = 256;
3128                 rdev->config.si.max_gs_threads = 32;
3129                 rdev->config.si.max_hw_contexts = 8;
3130 
3131                 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
3132                 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
3133                 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
3134                 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
3135                 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
3136                 break;
3137         case CHIP_VERDE:
3138         default:
3139                 rdev->config.si.max_shader_engines = 1;
3140                 rdev->config.si.max_tile_pipes = 4;
3141                 rdev->config.si.max_cu_per_sh = 5;
3142                 rdev->config.si.max_sh_per_se = 2;
3143                 rdev->config.si.max_backends_per_se = 4;
3144                 rdev->config.si.max_texture_channel_caches = 4;
3145                 rdev->config.si.max_gprs = 256;
3146                 rdev->config.si.max_gs_threads = 32;
3147                 rdev->config.si.max_hw_contexts = 8;
3148 
3149                 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
3150                 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
3151                 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
3152                 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
3153                 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
3154                 break;
3155         case CHIP_OLAND:
3156                 rdev->config.si.max_shader_engines = 1;
3157                 rdev->config.si.max_tile_pipes = 4;
3158                 rdev->config.si.max_cu_per_sh = 6;
3159                 rdev->config.si.max_sh_per_se = 1;
3160                 rdev->config.si.max_backends_per_se = 2;
3161                 rdev->config.si.max_texture_channel_caches = 4;
3162                 rdev->config.si.max_gprs = 256;
3163                 rdev->config.si.max_gs_threads = 16;
3164                 rdev->config.si.max_hw_contexts = 8;
3165 
3166                 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
3167                 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
3168                 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
3169                 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
3170                 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
3171                 break;
3172         case CHIP_HAINAN:
3173                 rdev->config.si.max_shader_engines = 1;
3174                 rdev->config.si.max_tile_pipes = 4;
3175                 rdev->config.si.max_cu_per_sh = 5;
3176                 rdev->config.si.max_sh_per_se = 1;
3177                 rdev->config.si.max_backends_per_se = 1;
3178                 rdev->config.si.max_texture_channel_caches = 2;
3179                 rdev->config.si.max_gprs = 256;
3180                 rdev->config.si.max_gs_threads = 16;
3181                 rdev->config.si.max_hw_contexts = 8;
3182 
3183                 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
3184                 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
3185                 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
3186                 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
3187                 gb_addr_config = HAINAN_GB_ADDR_CONFIG_GOLDEN;
3188                 break;
3189         }
3190 
3191         /* Initialize HDP */
3192         for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3193                 WREG32((0x2c14 + j), 0x00000000);
3194                 WREG32((0x2c18 + j), 0x00000000);
3195                 WREG32((0x2c1c + j), 0x00000000);
3196                 WREG32((0x2c20 + j), 0x00000000);
3197                 WREG32((0x2c24 + j), 0x00000000);
3198         }
3199 
3200         WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3201         WREG32(SRBM_INT_CNTL, 1);
3202         WREG32(SRBM_INT_ACK, 1);
3203 
3204         evergreen_fix_pci_max_read_req_size(rdev);
3205 
3206         WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
3207 
3208         mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3209         mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3210 
3211         rdev->config.si.num_tile_pipes = rdev->config.si.max_tile_pipes;
3212         rdev->config.si.mem_max_burst_length_bytes = 256;
3213         tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3214         rdev->config.si.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3215         if (rdev->config.si.mem_row_size_in_kb > 4)
3216                 rdev->config.si.mem_row_size_in_kb = 4;
3217         /* XXX use MC settings? */
3218         rdev->config.si.shader_engine_tile_size = 32;
3219         rdev->config.si.num_gpus = 1;
3220         rdev->config.si.multi_gpu_tile_size = 64;
3221 
3222         /* fix up row size */
3223         gb_addr_config &= ~ROW_SIZE_MASK;
3224         switch (rdev->config.si.mem_row_size_in_kb) {
3225         case 1:
3226         default:
3227                 gb_addr_config |= ROW_SIZE(0);
3228                 break;
3229         case 2:
3230                 gb_addr_config |= ROW_SIZE(1);
3231                 break;
3232         case 4:
3233                 gb_addr_config |= ROW_SIZE(2);
3234                 break;
3235         }
3236 
3237         /* setup tiling info dword.  gb_addr_config is not adequate since it does
3238          * not have bank info, so create a custom tiling dword.
3239          * bits 3:0   num_pipes
3240          * bits 7:4   num_banks
3241          * bits 11:8  group_size
3242          * bits 15:12 row_size
3243          */
3244         rdev->config.si.tile_config = 0;
3245         switch (rdev->config.si.num_tile_pipes) {
3246         case 1:
3247                 rdev->config.si.tile_config |= (0 << 0);
3248                 break;
3249         case 2:
3250                 rdev->config.si.tile_config |= (1 << 0);
3251                 break;
3252         case 4:
3253                 rdev->config.si.tile_config |= (2 << 0);
3254                 break;
3255         case 8:
3256         default:
3257                 /* XXX what about 12? */
3258                 rdev->config.si.tile_config |= (3 << 0);
3259                 break;
3260         }       
3261         switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3262         case 0: /* four banks */
3263                 rdev->config.si.tile_config |= 0 << 4;
3264                 break;
3265         case 1: /* eight banks */
3266                 rdev->config.si.tile_config |= 1 << 4;
3267                 break;
3268         case 2: /* sixteen banks */
3269         default:
3270                 rdev->config.si.tile_config |= 2 << 4;
3271                 break;
3272         }
3273         rdev->config.si.tile_config |=
3274                 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3275         rdev->config.si.tile_config |=
3276                 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3277 
3278         WREG32(GB_ADDR_CONFIG, gb_addr_config);
3279         WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3280         WREG32(DMIF_ADDR_CALC, gb_addr_config);
3281         WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3282         WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
3283         WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
3284         if (rdev->has_uvd) {
3285                 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3286                 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3287                 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3288         }
3289 
3290         si_tiling_mode_table_init(rdev);
3291 
3292         si_setup_rb(rdev, rdev->config.si.max_shader_engines,
3293                     rdev->config.si.max_sh_per_se,
3294                     rdev->config.si.max_backends_per_se);
3295 
3296         si_setup_spi(rdev, rdev->config.si.max_shader_engines,
3297                      rdev->config.si.max_sh_per_se,
3298                      rdev->config.si.max_cu_per_sh);
3299 
3300         rdev->config.si.active_cus = 0;
3301         for (i = 0; i < rdev->config.si.max_shader_engines; i++) {
3302                 for (j = 0; j < rdev->config.si.max_sh_per_se; j++) {
3303                         rdev->config.si.active_cus +=
3304                                 hweight32(si_get_cu_active_bitmap(rdev, i, j));
3305                 }
3306         }
3307 
3308         /* set HW defaults for 3D engine */
3309         WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3310                                      ROQ_IB2_START(0x2b)));
3311         WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3312 
3313         sx_debug_1 = RREG32(SX_DEBUG_1);
3314         WREG32(SX_DEBUG_1, sx_debug_1);
3315 
3316         WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3317 
3318         WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_frontend) |
3319                                  SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_backend) |
3320                                  SC_HIZ_TILE_FIFO_SIZE(rdev->config.si.sc_hiz_tile_fifo_size) |
3321                                  SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.si.sc_earlyz_tile_fifo_size)));
3322 
3323         WREG32(VGT_NUM_INSTANCES, 1);
3324 
3325         WREG32(CP_PERFMON_CNTL, 0);
3326 
3327         WREG32(SQ_CONFIG, 0);
3328 
3329         WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3330                                           FORCE_EOV_MAX_REZ_CNT(255)));
3331 
3332         WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
3333                AUTO_INVLD_EN(ES_AND_GS_AUTO));
3334 
3335         WREG32(VGT_GS_VERTEX_REUSE, 16);
3336         WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3337 
3338         WREG32(CB_PERFCOUNTER0_SELECT0, 0);
3339         WREG32(CB_PERFCOUNTER0_SELECT1, 0);
3340         WREG32(CB_PERFCOUNTER1_SELECT0, 0);
3341         WREG32(CB_PERFCOUNTER1_SELECT1, 0);
3342         WREG32(CB_PERFCOUNTER2_SELECT0, 0);
3343         WREG32(CB_PERFCOUNTER2_SELECT1, 0);
3344         WREG32(CB_PERFCOUNTER3_SELECT0, 0);
3345         WREG32(CB_PERFCOUNTER3_SELECT1, 0);
3346 
3347         tmp = RREG32(HDP_MISC_CNTL);
3348         tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3349         WREG32(HDP_MISC_CNTL, tmp);
3350 
3351         hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3352         WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3353 
3354         WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3355 
3356         udelay(50);
3357 }
3358 
3359 /*
3360  * GPU scratch registers helpers function.
3361  */
3362 static void si_scratch_init(struct radeon_device *rdev)
3363 {
3364         int i;
3365 
3366         rdev->scratch.num_reg = 7;
3367         rdev->scratch.reg_base = SCRATCH_REG0;
3368         for (i = 0; i < rdev->scratch.num_reg; i++) {
3369                 rdev->scratch.free[i] = true;
3370                 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
3371         }
3372 }
3373 
3374 void si_fence_ring_emit(struct radeon_device *rdev,
3375                         struct radeon_fence *fence)
3376 {
3377         struct radeon_ring *ring = &rdev->ring[fence->ring];
3378         u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3379 
3380         /* flush read cache over gart */
3381         radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3382         radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
3383         radeon_ring_write(ring, 0);
3384         radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
3385         radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
3386                           PACKET3_TC_ACTION_ENA |
3387                           PACKET3_SH_KCACHE_ACTION_ENA |
3388                           PACKET3_SH_ICACHE_ACTION_ENA);
3389         radeon_ring_write(ring, 0xFFFFFFFF);
3390         radeon_ring_write(ring, 0);
3391         radeon_ring_write(ring, 10); /* poll interval */
3392         /* EVENT_WRITE_EOP - flush caches, send int */
3393         radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3394         radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
3395         radeon_ring_write(ring, lower_32_bits(addr));
3396         radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
3397         radeon_ring_write(ring, fence->seq);
3398         radeon_ring_write(ring, 0);
3399 }
3400 
3401 /*
3402  * IB stuff
3403  */
3404 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3405 {
3406         struct radeon_ring *ring = &rdev->ring[ib->ring];
3407         unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
3408         u32 header;
3409 
3410         if (ib->is_const_ib) {
3411                 /* set switch buffer packet before const IB */
3412                 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
3413                 radeon_ring_write(ring, 0);
3414 
3415                 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
3416         } else {
3417                 u32 next_rptr;
3418                 if (ring->rptr_save_reg) {
3419                         next_rptr = ring->wptr + 3 + 4 + 8;
3420                         radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3421                         radeon_ring_write(ring, ((ring->rptr_save_reg -
3422                                                   PACKET3_SET_CONFIG_REG_START) >> 2));
3423                         radeon_ring_write(ring, next_rptr);
3424                 } else if (rdev->wb.enabled) {
3425                         next_rptr = ring->wptr + 5 + 4 + 8;
3426                         radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3427                         radeon_ring_write(ring, (1 << 8));
3428                         radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3429                         radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
3430                         radeon_ring_write(ring, next_rptr);
3431                 }
3432 
3433                 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
3434         }
3435 
3436         radeon_ring_write(ring, header);
3437         radeon_ring_write(ring,
3438 #ifdef __BIG_ENDIAN
3439                           (2 << 0) |
3440 #endif
3441                           (ib->gpu_addr & 0xFFFFFFFC));
3442         radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
3443         radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
3444 
3445         if (!ib->is_const_ib) {
3446                 /* flush read cache over gart for this vmid */
3447                 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3448                 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
3449                 radeon_ring_write(ring, vm_id);
3450                 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
3451                 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
3452                                   PACKET3_TC_ACTION_ENA |
3453                                   PACKET3_SH_KCACHE_ACTION_ENA |
3454                                   PACKET3_SH_ICACHE_ACTION_ENA);
3455                 radeon_ring_write(ring, 0xFFFFFFFF);
3456                 radeon_ring_write(ring, 0);
3457                 radeon_ring_write(ring, 10); /* poll interval */
3458         }
3459 }
3460 
3461 /*
3462  * CP.
3463  */
3464 static void si_cp_enable(struct radeon_device *rdev, bool enable)
3465 {
3466         if (enable)
3467                 WREG32(CP_ME_CNTL, 0);
3468         else {
3469                 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
3470                         radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
3471                 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
3472                 WREG32(SCRATCH_UMSK, 0);
3473                 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3474                 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3475                 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3476         }
3477         udelay(50);
3478 }
3479 
3480 static int si_cp_load_microcode(struct radeon_device *rdev)
3481 {
3482         int i;
3483 
3484         if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
3485                 return -EINVAL;
3486 
3487         si_cp_enable(rdev, false);
3488 
3489         if (rdev->new_fw) {
3490                 const struct gfx_firmware_header_v1_0 *pfp_hdr =
3491                         (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
3492                 const struct gfx_firmware_header_v1_0 *ce_hdr =
3493                         (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
3494                 const struct gfx_firmware_header_v1_0 *me_hdr =
3495                         (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
3496                 const __le32 *fw_data;
3497                 u32 fw_size;
3498 
3499                 radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
3500                 radeon_ucode_print_gfx_hdr(&ce_hdr->header);
3501                 radeon_ucode_print_gfx_hdr(&me_hdr->header);
3502 
3503                 /* PFP */
3504                 fw_data = (const __le32 *)
3505                         (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
3506                 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
3507                 WREG32(CP_PFP_UCODE_ADDR, 0);
3508                 for (i = 0; i < fw_size; i++)
3509                         WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
3510                 WREG32(CP_PFP_UCODE_ADDR, 0);
3511 
3512                 /* CE */
3513                 fw_data = (const __le32 *)
3514                         (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
3515                 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
3516                 WREG32(CP_CE_UCODE_ADDR, 0);
3517                 for (i = 0; i < fw_size; i++)
3518                         WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
3519                 WREG32(CP_CE_UCODE_ADDR, 0);
3520 
3521                 /* ME */
3522                 fw_data = (const __be32 *)
3523                         (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
3524                 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
3525                 WREG32(CP_ME_RAM_WADDR, 0);
3526                 for (i = 0; i < fw_size; i++)
3527                         WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
3528                 WREG32(CP_ME_RAM_WADDR, 0);
3529         } else {
3530                 const __be32 *fw_data;
3531 
3532                 /* PFP */
3533                 fw_data = (const __be32 *)rdev->pfp_fw->data;
3534                 WREG32(CP_PFP_UCODE_ADDR, 0);
3535                 for (i = 0; i < SI_PFP_UCODE_SIZE; i++)
3536                         WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
3537                 WREG32(CP_PFP_UCODE_ADDR, 0);
3538 
3539                 /* CE */
3540                 fw_data = (const __be32 *)rdev->ce_fw->data;
3541                 WREG32(CP_CE_UCODE_ADDR, 0);
3542                 for (i = 0; i < SI_CE_UCODE_SIZE; i++)
3543                         WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
3544                 WREG32(CP_CE_UCODE_ADDR, 0);
3545 
3546                 /* ME */
3547                 fw_data = (const __be32 *)rdev->me_fw->data;
3548                 WREG32(CP_ME_RAM_WADDR, 0);
3549                 for (i = 0; i < SI_PM4_UCODE_SIZE; i++)
3550                         WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
3551                 WREG32(CP_ME_RAM_WADDR, 0);
3552         }
3553 
3554         WREG32(CP_PFP_UCODE_ADDR, 0);
3555         WREG32(CP_CE_UCODE_ADDR, 0);
3556         WREG32(CP_ME_RAM_WADDR, 0);
3557         WREG32(CP_ME_RAM_RADDR, 0);
3558         return 0;
3559 }
3560 
3561 static int si_cp_start(struct radeon_device *rdev)
3562 {
3563         struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3564         int r, i;
3565 
3566         r = radeon_ring_lock(rdev, ring, 7 + 4);
3567         if (r) {
3568                 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3569                 return r;
3570         }
3571         /* init the CP */
3572         radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
3573         radeon_ring_write(ring, 0x1);
3574         radeon_ring_write(ring, 0x0);
3575         radeon_ring_write(ring, rdev->config.si.max_hw_contexts - 1);
3576         radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
3577         radeon_ring_write(ring, 0);
3578         radeon_ring_write(ring, 0);
3579 
3580         /* init the CE partitions */
3581         radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
3582         radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
3583         radeon_ring_write(ring, 0xc000);
3584         radeon_ring_write(ring, 0xe000);
3585         radeon_ring_unlock_commit(rdev, ring, false);
3586 
3587         si_cp_enable(rdev, true);
3588 
3589         r = radeon_ring_lock(rdev, ring, si_default_size + 10);
3590         if (r) {
3591                 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3592                 return r;
3593         }
3594 
3595         /* setup clear context state */
3596         radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3597         radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3598 
3599         for (i = 0; i < si_default_size; i++)
3600                 radeon_ring_write(ring, si_default_state[i]);
3601 
3602         radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3603         radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3604 
3605         /* set clear context state */
3606         radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3607         radeon_ring_write(ring, 0);
3608 
3609         radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
3610         radeon_ring_write(ring, 0x00000316);
3611         radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3612         radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
3613 
3614         radeon_ring_unlock_commit(rdev, ring, false);
3615 
3616         for (i = RADEON_RING_TYPE_GFX_INDEX; i <= CAYMAN_RING_TYPE_CP2_INDEX; ++i) {
3617                 ring = &rdev->ring[i];
3618                 r = radeon_ring_lock(rdev, ring, 2);
3619 
3620                 /* clear the compute context state */
3621                 radeon_ring_write(ring, PACKET3_COMPUTE(PACKET3_CLEAR_STATE, 0));
3622                 radeon_ring_write(ring, 0);
3623 
3624                 radeon_ring_unlock_commit(rdev, ring, false);
3625         }
3626 
3627         return 0;
3628 }
3629 
3630 static void si_cp_fini(struct radeon_device *rdev)
3631 {
3632         struct radeon_ring *ring;
3633         si_cp_enable(rdev, false);
3634 
3635         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3636         radeon_ring_fini(rdev, ring);
3637         radeon_scratch_free(rdev, ring->rptr_save_reg);
3638 
3639         ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
3640         radeon_ring_fini(rdev, ring);
3641         radeon_scratch_free(rdev, ring->rptr_save_reg);
3642 
3643         ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
3644         radeon_ring_fini(rdev, ring);
3645         radeon_scratch_free(rdev, ring->rptr_save_reg);
3646 }
3647 
3648 static int si_cp_resume(struct radeon_device *rdev)
3649 {
3650         struct radeon_ring *ring;
3651         u32 tmp;
3652         u32 rb_bufsz;
3653         int r;
3654 
3655         si_enable_gui_idle_interrupt(rdev, false);
3656 
3657         WREG32(CP_SEM_WAIT_TIMER, 0x0);
3658         WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3659 
3660         /* Set the write pointer delay */
3661         WREG32(CP_RB_WPTR_DELAY, 0);
3662 
3663         WREG32(CP_DEBUG, 0);
3664         WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3665 
3666         /* ring 0 - compute and gfx */
3667         /* Set ring buffer size */
3668         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3669         rb_bufsz = order_base_2(ring->ring_size / 8);
3670         tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3671 #ifdef __BIG_ENDIAN
3672         tmp |= BUF_SWAP_32BIT;
3673 #endif
3674         WREG32(CP_RB0_CNTL, tmp);
3675 
3676         /* Initialize the ring buffer's read and write pointers */
3677         WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
3678         ring->wptr = 0;
3679         WREG32(CP_RB0_WPTR, ring->wptr);
3680 
3681         /* set the wb address whether it's enabled or not */
3682         WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
3683         WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3684 
3685         if (rdev->wb.enabled)
3686                 WREG32(SCRATCH_UMSK, 0xff);
3687         else {
3688                 tmp |= RB_NO_UPDATE;
3689                 WREG32(SCRATCH_UMSK, 0);
3690         }
3691 
3692         mdelay(1);
3693         WREG32(CP_RB0_CNTL, tmp);
3694 
3695         WREG32(CP_RB0_BASE, ring->gpu_addr >> 8);
3696 
3697         /* ring1  - compute only */
3698         /* Set ring buffer size */
3699         ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
3700         rb_bufsz = order_base_2(ring->ring_size / 8);
3701         tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3702 #ifdef __BIG_ENDIAN
3703         tmp |= BUF_SWAP_32BIT;
3704 #endif
3705         WREG32(CP_RB1_CNTL, tmp);
3706 
3707         /* Initialize the ring buffer's read and write pointers */
3708         WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
3709         ring->wptr = 0;
3710         WREG32(CP_RB1_WPTR, ring->wptr);
3711 
3712         /* set the wb address whether it's enabled or not */
3713         WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
3714         WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
3715 
3716         mdelay(1);
3717         WREG32(CP_RB1_CNTL, tmp);
3718 
3719         WREG32(CP_RB1_BASE, ring->gpu_addr >> 8);
3720 
3721         /* ring2 - compute only */
3722         /* Set ring buffer size */
3723         ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
3724         rb_bufsz = order_base_2(ring->ring_size / 8);
3725         tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3726 #ifdef __BIG_ENDIAN
3727         tmp |= BUF_SWAP_32BIT;
3728 #endif
3729         WREG32(CP_RB2_CNTL, tmp);
3730 
3731         /* Initialize the ring buffer's read and write pointers */
3732         WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
3733         ring->wptr = 0;
3734         WREG32(CP_RB2_WPTR, ring->wptr);
3735 
3736         /* set the wb address whether it's enabled or not */
3737         WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
3738         WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
3739 
3740         mdelay(1);
3741         WREG32(CP_RB2_CNTL, tmp);
3742 
3743         WREG32(CP_RB2_BASE, ring->gpu_addr >> 8);
3744 
3745         /* start the rings */
3746         si_cp_start(rdev);
3747         rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
3748         rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = true;
3749         rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = true;
3750         r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3751         if (r) {
3752                 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3753                 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3754                 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3755                 return r;
3756         }
3757         r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP1_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]);
3758         if (r) {
3759                 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3760         }
3761         r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP2_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]);
3762         if (r) {
3763                 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3764         }
3765 
3766         si_enable_gui_idle_interrupt(rdev, true);
3767 
3768         if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
3769                 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
3770 
3771         return 0;
3772 }
3773 
3774 u32 si_gpu_check_soft_reset(struct radeon_device *rdev)
3775 {
3776         u32 reset_mask = 0;
3777         u32 tmp;
3778 
3779         /* GRBM_STATUS */
3780         tmp = RREG32(GRBM_STATUS);
3781         if (tmp & (PA_BUSY | SC_BUSY |
3782                    BCI_BUSY | SX_BUSY |
3783                    TA_BUSY | VGT_BUSY |
3784                    DB_BUSY | CB_BUSY |
3785                    GDS_BUSY | SPI_BUSY |
3786                    IA_BUSY | IA_BUSY_NO_DMA))
3787                 reset_mask |= RADEON_RESET_GFX;
3788 
3789         if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3790                    CP_BUSY | CP_COHERENCY_BUSY))
3791                 reset_mask |= RADEON_RESET_CP;
3792 
3793         if (tmp & GRBM_EE_BUSY)
3794                 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3795 
3796         /* GRBM_STATUS2 */
3797         tmp = RREG32(GRBM_STATUS2);
3798         if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3799                 reset_mask |= RADEON_RESET_RLC;
3800 
3801         /* DMA_STATUS_REG 0 */
3802         tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
3803         if (!(tmp & DMA_IDLE))
3804                 reset_mask |= RADEON_RESET_DMA;
3805 
3806         /* DMA_STATUS_REG 1 */
3807         tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
3808         if (!(tmp & DMA_IDLE))
3809                 reset_mask |= RADEON_RESET_DMA1;
3810 
3811         /* SRBM_STATUS2 */
3812         tmp = RREG32(SRBM_STATUS2);
3813         if (tmp & DMA_BUSY)
3814                 reset_mask |= RADEON_RESET_DMA;
3815 
3816         if (tmp & DMA1_BUSY)
3817                 reset_mask |= RADEON_RESET_DMA1;
3818 
3819         /* SRBM_STATUS */
3820         tmp = RREG32(SRBM_STATUS);
3821 
3822         if (tmp & IH_BUSY)
3823                 reset_mask |= RADEON_RESET_IH;
3824 
3825         if (tmp & SEM_BUSY)
3826                 reset_mask |= RADEON_RESET_SEM;
3827 
3828         if (tmp & GRBM_RQ_PENDING)
3829                 reset_mask |= RADEON_RESET_GRBM;
3830 
3831         if (tmp & VMC_BUSY)
3832                 reset_mask |= RADEON_RESET_VMC;
3833 
3834         if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3835                    MCC_BUSY | MCD_BUSY))
3836                 reset_mask |= RADEON_RESET_MC;
3837 
3838         if (evergreen_is_display_hung(rdev))
3839                 reset_mask |= RADEON_RESET_DISPLAY;
3840 
3841         /* VM_L2_STATUS */
3842         tmp = RREG32(VM_L2_STATUS);
3843         if (tmp & L2_BUSY)
3844                 reset_mask |= RADEON_RESET_VMC;
3845 
3846         /* Skip MC reset as it's mostly likely not hung, just busy */
3847         if (reset_mask & RADEON_RESET_MC) {
3848                 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3849                 reset_mask &= ~RADEON_RESET_MC;
3850         }
3851 
3852         return reset_mask;
3853 }
3854 
3855 static void si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3856 {
3857         struct evergreen_mc_save save;
3858         u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3859         u32 tmp;
3860 
3861         if (reset_mask == 0)
3862                 return;
3863 
3864         dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3865 
3866         evergreen_print_gpu_status_regs(rdev);
3867         dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
3868                  RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
3869         dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
3870                  RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
3871 
3872         /* disable PG/CG */
3873         si_fini_pg(rdev);
3874         si_fini_cg(rdev);
3875 
3876         /* stop the rlc */
3877         si_rlc_stop(rdev);
3878 
3879         /* Disable CP parsing/prefetching */
3880         WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
3881 
3882         if (reset_mask & RADEON_RESET_DMA) {
3883                 /* dma0 */
3884                 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
3885                 tmp &= ~DMA_RB_ENABLE;
3886                 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
3887         }
3888         if (reset_mask & RADEON_RESET_DMA1) {
3889                 /* dma1 */
3890                 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
3891                 tmp &= ~DMA_RB_ENABLE;
3892                 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
3893         }
3894 
3895         udelay(50);
3896 
3897         evergreen_mc_stop(rdev, &save);
3898         if (evergreen_mc_wait_for_idle(rdev)) {
3899                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3900         }
3901 
3902         if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) {
3903                 grbm_soft_reset = SOFT_RESET_CB |
3904                         SOFT_RESET_DB |
3905                         SOFT_RESET_GDS |
3906                         SOFT_RESET_PA |
3907                         SOFT_RESET_SC |
3908                         SOFT_RESET_BCI |
3909                         SOFT_RESET_SPI |
3910                         SOFT_RESET_SX |
3911                         SOFT_RESET_TC |
3912                         SOFT_RESET_TA |
3913                         SOFT_RESET_VGT |
3914                         SOFT_RESET_IA;
3915         }
3916 
3917         if (reset_mask & RADEON_RESET_CP) {
3918                 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
3919 
3920                 srbm_soft_reset |= SOFT_RESET_GRBM;
3921         }
3922 
3923         if (reset_mask & RADEON_RESET_DMA)
3924                 srbm_soft_reset |= SOFT_RESET_DMA;
3925 
3926         if (reset_mask & RADEON_RESET_DMA1)
3927                 srbm_soft_reset |= SOFT_RESET_DMA1;
3928 
3929         if (reset_mask & RADEON_RESET_DISPLAY)
3930                 srbm_soft_reset |= SOFT_RESET_DC;
3931 
3932         if (reset_mask & RADEON_RESET_RLC)
3933                 grbm_soft_reset |= SOFT_RESET_RLC;
3934 
3935         if (reset_mask & RADEON_RESET_SEM)
3936                 srbm_soft_reset |= SOFT_RESET_SEM;
3937 
3938         if (reset_mask & RADEON_RESET_IH)
3939                 srbm_soft_reset |= SOFT_RESET_IH;
3940 
3941         if (reset_mask & RADEON_RESET_GRBM)
3942                 srbm_soft_reset |= SOFT_RESET_GRBM;
3943 
3944         if (reset_mask & RADEON_RESET_VMC)
3945                 srbm_soft_reset |= SOFT_RESET_VMC;
3946 
3947         if (reset_mask & RADEON_RESET_MC)
3948                 srbm_soft_reset |= SOFT_RESET_MC;
3949 
3950         if (grbm_soft_reset) {
3951                 tmp = RREG32(GRBM_SOFT_RESET);
3952                 tmp |= grbm_soft_reset;
3953                 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3954                 WREG32(GRBM_SOFT_RESET, tmp);
3955                 tmp = RREG32(GRBM_SOFT_RESET);
3956 
3957                 udelay(50);
3958 
3959                 tmp &= ~grbm_soft_reset;
3960                 WREG32(GRBM_SOFT_RESET, tmp);
3961                 tmp = RREG32(GRBM_SOFT_RESET);
3962         }
3963 
3964         if (srbm_soft_reset) {
3965                 tmp = RREG32(SRBM_SOFT_RESET);
3966                 tmp |= srbm_soft_reset;
3967                 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3968                 WREG32(SRBM_SOFT_RESET, tmp);
3969                 tmp = RREG32(SRBM_SOFT_RESET);
3970 
3971                 udelay(50);
3972 
3973                 tmp &= ~srbm_soft_reset;
3974                 WREG32(SRBM_SOFT_RESET, tmp);
3975                 tmp = RREG32(SRBM_SOFT_RESET);
3976         }
3977 
3978         /* Wait a little for things to settle down */
3979         udelay(50);
3980 
3981         evergreen_mc_resume(rdev, &save);
3982         udelay(50);
3983 
3984         evergreen_print_gpu_status_regs(rdev);
3985 }
3986 
3987 static void si_set_clk_bypass_mode(struct radeon_device *rdev)
3988 {
3989         u32 tmp, i;
3990 
3991         tmp = RREG32(CG_SPLL_FUNC_CNTL);
3992         tmp |= SPLL_BYPASS_EN;
3993         WREG32(CG_SPLL_FUNC_CNTL, tmp);
3994 
3995         tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
3996         tmp |= SPLL_CTLREQ_CHG;
3997         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
3998 
3999         for (i = 0; i < rdev->usec_timeout; i++) {
4000                 if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
4001                         break;
4002                 udelay(1);
4003         }
4004 
4005         tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
4006         tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
4007         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
4008 
4009         tmp = RREG32(MPLL_CNTL_MODE);
4010         tmp &= ~MPLL_MCLK_SEL;
4011         WREG32(MPLL_CNTL_MODE, tmp);
4012 }
4013 
4014 static void si_spll_powerdown(struct radeon_device *rdev)
4015 {
4016         u32 tmp;
4017 
4018         tmp = RREG32(SPLL_CNTL_MODE);
4019         tmp |= SPLL_SW_DIR_CONTROL;
4020         WREG32(SPLL_CNTL_MODE, tmp);
4021 
4022         tmp = RREG32(CG_SPLL_FUNC_CNTL);
4023         tmp |= SPLL_RESET;
4024         WREG32(CG_SPLL_FUNC_CNTL, tmp);
4025 
4026         tmp = RREG32(CG_SPLL_FUNC_CNTL);
4027         tmp |= SPLL_SLEEP;
4028         WREG32(CG_SPLL_FUNC_CNTL, tmp);
4029 
4030         tmp = RREG32(SPLL_CNTL_MODE);
4031         tmp &= ~SPLL_SW_DIR_CONTROL;
4032         WREG32(SPLL_CNTL_MODE, tmp);
4033 }
4034 
4035 static void si_gpu_pci_config_reset(struct radeon_device *rdev)
4036 {
4037         struct evergreen_mc_save save;
4038         u32 tmp, i;
4039 
4040         dev_info(rdev->dev, "GPU pci config reset\n");
4041 
4042         /* disable dpm? */
4043 
4044         /* disable cg/pg */
4045         si_fini_pg(rdev);
4046         si_fini_cg(rdev);
4047 
4048         /* Disable CP parsing/prefetching */
4049         WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
4050         /* dma0 */
4051         tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
4052         tmp &= ~DMA_RB_ENABLE;
4053         WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
4054         /* dma1 */
4055         tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
4056         tmp &= ~DMA_RB_ENABLE;
4057         WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
4058         /* XXX other engines? */
4059 
4060         /* halt the rlc, disable cp internal ints */
4061         si_rlc_stop(rdev);
4062 
4063         udelay(50);
4064 
4065         /* disable mem access */
4066         evergreen_mc_stop(rdev, &save);
4067         if (evergreen_mc_wait_for_idle(rdev)) {
4068                 dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
4069         }
4070 
4071         /* set mclk/sclk to bypass */
4072         si_set_clk_bypass_mode(rdev);
4073         /* powerdown spll */
4074         si_spll_powerdown(rdev);
4075         /* disable BM */
4076         pci_clear_master(rdev->pdev);
4077         /* reset */
4078         radeon_pci_config_reset(rdev);
4079         /* wait for asic to come out of reset */
4080         for (i = 0; i < rdev->usec_timeout; i++) {
4081                 if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
4082                         break;
4083                 udelay(1);
4084         }
4085 }
4086 
4087 int si_asic_reset(struct radeon_device *rdev, bool hard)
4088 {
4089         u32 reset_mask;
4090 
4091         if (hard) {
4092                 si_gpu_pci_config_reset(rdev);
4093                 return 0;
4094         }
4095 
4096         reset_mask = si_gpu_check_soft_reset(rdev);
4097 
4098         if (reset_mask)
4099                 r600_set_bios_scratch_engine_hung(rdev, true);
4100 
4101         /* try soft reset */
4102         si_gpu_soft_reset(rdev, reset_mask);
4103 
4104         reset_mask = si_gpu_check_soft_reset(rdev);
4105 
4106         /* try pci config reset */
4107         if (reset_mask && radeon_hard_reset)
4108                 si_gpu_pci_config_reset(rdev);
4109 
4110         reset_mask = si_gpu_check_soft_reset(rdev);
4111 
4112         if (!reset_mask)
4113                 r600_set_bios_scratch_engine_hung(rdev, false);
4114 
4115         return 0;
4116 }
4117 
4118 /**
4119  * si_gfx_is_lockup - Check if the GFX engine is locked up
4120  *
4121  * @rdev: radeon_device pointer
4122  * @ring: radeon_ring structure holding ring information
4123  *
4124  * Check if the GFX engine is locked up.
4125  * Returns true if the engine appears to be locked up, false if not.
4126  */
4127 bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4128 {
4129         u32 reset_mask = si_gpu_check_soft_reset(rdev);
4130 
4131         if (!(reset_mask & (RADEON_RESET_GFX |
4132                             RADEON_RESET_COMPUTE |
4133                             RADEON_RESET_CP))) {
4134                 radeon_ring_lockup_update(rdev, ring);
4135                 return false;
4136         }
4137         return radeon_ring_test_lockup(rdev, ring);
4138 }
4139 
4140 /* MC */
4141 static void si_mc_program(struct radeon_device *rdev)
4142 {
4143         struct evergreen_mc_save save;
4144         u32 tmp;
4145         int i, j;
4146 
4147         /* Initialize HDP */
4148         for (i = 0, j = 0; i < 32; i++, j += 0x18) {
4149                 WREG32((0x2c14 + j), 0x00000000);
4150                 WREG32((0x2c18 + j), 0x00000000);
4151                 WREG32((0x2c1c + j), 0x00000000);
4152                 WREG32((0x2c20 + j), 0x00000000);
4153                 WREG32((0x2c24 + j), 0x00000000);
4154         }
4155         WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
4156 
4157         evergreen_mc_stop(rdev, &save);
4158         if (radeon_mc_wait_for_idle(rdev)) {
4159                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4160         }
4161         if (!ASIC_IS_NODCE(rdev))
4162                 /* Lockout access through VGA aperture*/
4163                 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
4164         /* Update configuration */
4165         WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
4166                rdev->mc.vram_start >> 12);
4167         WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
4168                rdev->mc.vram_end >> 12);
4169         WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
4170                rdev->vram_scratch.gpu_addr >> 12);
4171         tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
4172         tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
4173         WREG32(MC_VM_FB_LOCATION, tmp);
4174         /* XXX double check these! */
4175         WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
4176         WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
4177         WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
4178         WREG32(MC_VM_AGP_BASE, 0);
4179         WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
4180         WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
4181         if (radeon_mc_wait_for_idle(rdev)) {
4182                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4183         }
4184         evergreen_mc_resume(rdev, &save);
4185         if (!ASIC_IS_NODCE(rdev)) {
4186                 /* we need to own VRAM, so turn off the VGA renderer here
4187                  * to stop it overwriting our objects */
4188                 rv515_vga_render_disable(rdev);
4189         }
4190 }
4191 
4192 void si_vram_gtt_location(struct radeon_device *rdev,
4193                           struct radeon_mc *mc)
4194 {
4195         if (mc->mc_vram_size > 0xFFC0000000ULL) {
4196                 /* leave room for at least 1024M GTT */
4197                 dev_warn(rdev->dev, "limiting VRAM\n");
4198                 mc->real_vram_size = 0xFFC0000000ULL;
4199                 mc->mc_vram_size = 0xFFC0000000ULL;
4200         }
4201         radeon_vram_location(rdev, &rdev->mc, 0);
4202         rdev->mc.gtt_base_align = 0;
4203         radeon_gtt_location(rdev, mc);
4204 }
4205 
4206 static int si_mc_init(struct radeon_device *rdev)
4207 {
4208         u32 tmp;
4209         int chansize, numchan;
4210 
4211         /* Get VRAM informations */
4212         rdev->mc.vram_is_ddr = true;
4213         tmp = RREG32(MC_ARB_RAMCFG);
4214         if (tmp & CHANSIZE_OVERRIDE) {
4215                 chansize = 16;
4216         } else if (tmp & CHANSIZE_MASK) {
4217                 chansize = 64;
4218         } else {
4219                 chansize = 32;
4220         }
4221         tmp = RREG32(MC_SHARED_CHMAP);
4222         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
4223         case 0:
4224         default:
4225                 numchan = 1;
4226                 break;
4227         case 1:
4228                 numchan = 2;
4229                 break;
4230         case 2:
4231                 numchan = 4;
4232                 break;
4233         case 3:
4234                 numchan = 8;
4235                 break;
4236         case 4:
4237                 numchan = 3;
4238                 break;
4239         case 5:
4240                 numchan = 6;
4241                 break;
4242         case 6:
4243                 numchan = 10;
4244                 break;
4245         case 7:
4246                 numchan = 12;
4247                 break;
4248         case 8:
4249                 numchan = 16;
4250                 break;
4251         }
4252         rdev->mc.vram_width = numchan * chansize;
4253         /* Could aper size report 0 ? */
4254         rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
4255         rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
4256         /* size in MB on si */
4257         tmp = RREG32(CONFIG_MEMSIZE);
4258         /* some boards may have garbage in the upper 16 bits */
4259         if (tmp & 0xffff0000) {
4260                 DRM_INFO("Probable bad vram size: 0x%08x\n", tmp);
4261                 if (tmp & 0xffff)
4262                         tmp &= 0xffff;
4263         }
4264         rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL;
4265         rdev->mc.real_vram_size = rdev->mc.mc_vram_size;
4266         rdev->mc.visible_vram_size = rdev->mc.aper_size;
4267         si_vram_gtt_location(rdev, &rdev->mc);
4268         radeon_update_bandwidth_info(rdev);
4269 
4270         return 0;
4271 }
4272 
4273 /*
4274  * GART
4275  */
4276 void si_pcie_gart_tlb_flush(struct radeon_device *rdev)
4277 {
4278         /* flush hdp cache */
4279         WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
4280 
4281         /* bits 0-15 are the VM contexts0-15 */
4282         WREG32(VM_INVALIDATE_REQUEST, 1);
4283 }
4284 
4285 static int si_pcie_gart_enable(struct radeon_device *rdev)
4286 {
4287         int r, i;
4288 
4289         if (rdev->gart.robj == NULL) {
4290                 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
4291                 return -EINVAL;
4292         }
4293         r = radeon_gart_table_vram_pin(rdev);
4294         if (r)
4295                 return r;
4296         /* Setup TLB control */
4297         WREG32(MC_VM_MX_L1_TLB_CNTL,
4298                (0xA << 7) |
4299                ENABLE_L1_TLB |
4300                ENABLE_L1_FRAGMENT_PROCESSING |
4301                SYSTEM_ACCESS_MODE_NOT_IN_SYS |
4302                ENABLE_ADVANCED_DRIVER_MODEL |
4303                SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
4304         /* Setup L2 cache */
4305         WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
4306                ENABLE_L2_FRAGMENT_PROCESSING |
4307                ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
4308                ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
4309                EFFECTIVE_L2_QUEUE_SIZE(7) |
4310                CONTEXT1_IDENTITY_ACCESS_MODE(1));
4311         WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
4312         WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
4313                BANK_SELECT(4) |
4314                L2_CACHE_BIGK_FRAGMENT_SIZE(4));
4315         /* setup context0 */
4316         WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
4317         WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
4318         WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
4319         WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
4320                         (u32)(rdev->dummy_page.addr >> 12));
4321         WREG32(VM_CONTEXT0_CNTL2, 0);
4322         WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
4323                                   RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
4324 
4325         WREG32(0x15D4, 0);
4326         WREG32(0x15D8, 0);
4327         WREG32(0x15DC, 0);
4328 
4329         /* empty context1-15 */
4330         /* set vm size, must be a multiple of 4 */
4331         WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
4332         WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn - 1);
4333         /* Assign the pt base to something valid for now; the pts used for
4334          * the VMs are determined by the application and setup and assigned
4335          * on the fly in the vm part of radeon_gart.c
4336          */
4337         for (i = 1; i < 16; i++) {
4338                 if (i < 8)
4339                         WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
4340                                rdev->vm_manager.saved_table_addr[i]);
4341                 else
4342                         WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
4343                                rdev->vm_manager.saved_table_addr[i]);
4344         }
4345 
4346         /* enable context1-15 */
4347         WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
4348                (u32)(rdev->dummy_page.addr >> 12));
4349         WREG32(VM_CONTEXT1_CNTL2, 4);
4350         WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
4351                                 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
4352                                 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4353                                 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
4354                                 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4355                                 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
4356                                 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
4357                                 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
4358                                 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
4359                                 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
4360                                 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
4361                                 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
4362                                 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4363                                 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
4364 
4365         si_pcie_gart_tlb_flush(rdev);
4366         DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
4367                  (unsigned)(rdev->mc.gtt_size >> 20),
4368                  (unsigned long long)rdev->gart.table_addr);
4369         rdev->gart.ready = true;
4370         return 0;
4371 }
4372 
4373 static void si_pcie_gart_disable(struct radeon_device *rdev)
4374 {
4375         unsigned i;
4376 
4377         for (i = 1; i < 16; ++i) {
4378                 uint32_t reg;
4379                 if (i < 8)
4380                         reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2);
4381                 else
4382                         reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2);
4383                 rdev->vm_manager.saved_table_addr[i] = RREG32(reg);
4384         }
4385 
4386         /* Disable all tables */
4387         WREG32(VM_CONTEXT0_CNTL, 0);
4388         WREG32(VM_CONTEXT1_CNTL, 0);
4389         /* Setup TLB control */
4390         WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
4391                SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
4392         /* Setup L2 cache */
4393         WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
4394                ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
4395                EFFECTIVE_L2_QUEUE_SIZE(7) |
4396                CONTEXT1_IDENTITY_ACCESS_MODE(1));
4397         WREG32(VM_L2_CNTL2, 0);
4398         WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
4399                L2_CACHE_BIGK_FRAGMENT_SIZE(0));
4400         radeon_gart_table_vram_unpin(rdev);
4401 }
4402 
4403 static void si_pcie_gart_fini(struct radeon_device *rdev)
4404 {
4405         si_pcie_gart_disable(rdev);
4406         radeon_gart_table_vram_free(rdev);
4407         radeon_gart_fini(rdev);
4408 }
4409 
4410 /* vm parser */
4411 static bool si_vm_reg_valid(u32 reg)
4412 {
4413         /* context regs are fine */
4414         if (reg >= 0x28000)
4415                 return true;
4416 
4417         /* shader regs are also fine */
4418         if (reg >= 0xB000 && reg < 0xC000)
4419                 return true;
4420 
4421         /* check config regs */
4422         switch (reg) {
4423         case GRBM_GFX_INDEX:
4424         case CP_STRMOUT_CNTL:
4425         case VGT_VTX_VECT_EJECT_REG:
4426         case VGT_CACHE_INVALIDATION:
4427         case VGT_ESGS_RING_SIZE:
4428         case VGT_GSVS_RING_SIZE:
4429         case VGT_GS_VERTEX_REUSE:
4430         case VGT_PRIMITIVE_TYPE:
4431         case VGT_INDEX_TYPE:
4432         case VGT_NUM_INDICES:
4433         case VGT_NUM_INSTANCES:
4434         case VGT_TF_RING_SIZE:
4435         case VGT_HS_OFFCHIP_PARAM:
4436         case VGT_TF_MEMORY_BASE:
4437         case PA_CL_ENHANCE:
4438         case PA_SU_LINE_STIPPLE_VALUE:
4439         case PA_SC_LINE_STIPPLE_STATE:
4440         case PA_SC_ENHANCE:
4441         case SQC_CACHES:
4442         case SPI_STATIC_THREAD_MGMT_1:
4443         case SPI_STATIC_THREAD_MGMT_2:
4444         case SPI_STATIC_THREAD_MGMT_3:
4445         case SPI_PS_MAX_WAVE_ID:
4446         case SPI_CONFIG_CNTL:
4447         case SPI_CONFIG_CNTL_1:
4448         case TA_CNTL_AUX:
4449         case TA_CS_BC_BASE_ADDR:
4450                 return true;
4451         default:
4452                 DRM_ERROR("Invalid register 0x%x in CS\n", reg);
4453                 return false;
4454         }
4455 }
4456 
4457 static int si_vm_packet3_ce_check(struct radeon_device *rdev,
4458                                   u32 *ib, struct radeon_cs_packet *pkt)
4459 {
4460         switch (pkt->opcode) {
4461         case PACKET3_NOP:
4462         case PACKET3_SET_BASE:
4463         case PACKET3_SET_CE_DE_COUNTERS:
4464         case PACKET3_LOAD_CONST_RAM:
4465         case PACKET3_WRITE_CONST_RAM:
4466         case PACKET3_WRITE_CONST_RAM_OFFSET:
4467         case PACKET3_DUMP_CONST_RAM:
4468         case PACKET3_INCREMENT_CE_COUNTER:
4469         case PACKET3_WAIT_ON_DE_COUNTER:
4470         case PACKET3_CE_WRITE:
4471                 break;
4472         default:
4473                 DRM_ERROR("Invalid CE packet3: 0x%x\n", pkt->opcode);
4474                 return -EINVAL;
4475         }
4476         return 0;
4477 }
4478 
4479 static int si_vm_packet3_cp_dma_check(u32 *ib, u32 idx)
4480 {
4481         u32 start_reg, reg, i;
4482         u32 command = ib[idx + 4];
4483         u32 info = ib[idx + 1];
4484         u32 idx_value = ib[idx];
4485         if (command & PACKET3_CP_DMA_CMD_SAS) {
4486                 /* src address space is register */
4487                 if (((info & 0x60000000) >> 29) == 0) {
4488                         start_reg = idx_value << 2;
4489                         if (command & PACKET3_CP_DMA_CMD_SAIC) {
4490                                 reg = start_reg;
4491                                 if (!si_vm_reg_valid(reg)) {
4492                                         DRM_ERROR("CP DMA Bad SRC register\n");
4493                                         return -EINVAL;
4494                                 }
4495                         } else {
4496                                 for (i = 0; i < (command & 0x1fffff); i++) {
4497                                         reg = start_reg + (4 * i);
4498                                         if (!si_vm_reg_valid(reg)) {
4499                                                 DRM_ERROR("CP DMA Bad SRC register\n");
4500                                                 return -EINVAL;
4501                                         }
4502                                 }
4503                         }
4504                 }
4505         }
4506         if (command & PACKET3_CP_DMA_CMD_DAS) {
4507                 /* dst address space is register */
4508                 if (((info & 0x00300000) >> 20) == 0) {
4509                         start_reg = ib[idx + 2];
4510                         if (command & PACKET3_CP_DMA_CMD_DAIC) {
4511                                 reg = start_reg;
4512                                 if (!si_vm_reg_valid(reg)) {
4513                                         DRM_ERROR("CP DMA Bad DST register\n");
4514                                         return -EINVAL;
4515                                 }
4516                         } else {
4517                                 for (i = 0; i < (command & 0x1fffff); i++) {
4518                                         reg = start_reg + (4 * i);
4519                                 if (!si_vm_reg_valid(reg)) {
4520                                                 DRM_ERROR("CP DMA Bad DST register\n");
4521                                                 return -EINVAL;
4522                                         }
4523                                 }
4524                         }
4525                 }
4526         }
4527         return 0;
4528 }
4529 
4530 static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
4531                                    u32 *ib, struct radeon_cs_packet *pkt)
4532 {
4533         int r;
4534         u32 idx = pkt->idx + 1;
4535         u32 idx_value = ib[idx];
4536         u32 start_reg, end_reg, reg, i;
4537 
4538         switch (pkt->opcode) {
4539         case PACKET3_NOP:
4540         case PACKET3_SET_BASE:
4541         case PACKET3_CLEAR_STATE:
4542         case PACKET3_INDEX_BUFFER_SIZE:
4543         case PACKET3_DISPATCH_DIRECT:
4544         case PACKET3_DISPATCH_INDIRECT:
4545         case PACKET3_ALLOC_GDS:
4546         case PACKET3_WRITE_GDS_RAM:
4547         case PACKET3_ATOMIC_GDS:
4548         case PACKET3_ATOMIC:
4549         case PACKET3_OCCLUSION_QUERY:
4550         case PACKET3_SET_PREDICATION:
4551         case PACKET3_COND_EXEC:
4552         case PACKET3_PRED_EXEC:
4553         case PACKET3_DRAW_INDIRECT:
4554         case PACKET3_DRAW_INDEX_INDIRECT:
4555         case PACKET3_INDEX_BASE:
4556         case PACKET3_DRAW_INDEX_2:
4557         case PACKET3_CONTEXT_CONTROL:
4558         case PACKET3_INDEX_TYPE:
4559         case PACKET3_DRAW_INDIRECT_MULTI:
4560         case PACKET3_DRAW_INDEX_AUTO:
4561         case PACKET3_DRAW_INDEX_IMMD:
4562         case PACKET3_NUM_INSTANCES:
4563         case PACKET3_DRAW_INDEX_MULTI_AUTO:
4564         case PACKET3_STRMOUT_BUFFER_UPDATE:
4565         case PACKET3_DRAW_INDEX_OFFSET_2:
4566         case PACKET3_DRAW_INDEX_MULTI_ELEMENT:
4567         case PACKET3_DRAW_INDEX_INDIRECT_MULTI:
4568         case PACKET3_MPEG_INDEX:
4569         case PACKET3_WAIT_REG_MEM:
4570         case PACKET3_MEM_WRITE:
4571         case PACKET3_PFP_SYNC_ME:
4572         case PACKET3_SURFACE_SYNC:
4573         case PACKET3_EVENT_WRITE:
4574         case PACKET3_EVENT_WRITE_EOP:
4575         case PACKET3_EVENT_WRITE_EOS:
4576         case PACKET3_SET_CONTEXT_REG:
4577         case PACKET3_SET_CONTEXT_REG_INDIRECT:
4578         case PACKET3_SET_SH_REG:
4579         case PACKET3_SET_SH_REG_OFFSET:
4580         case PACKET3_INCREMENT_DE_COUNTER:
4581         case PACKET3_WAIT_ON_CE_COUNTER:
4582         case PACKET3_WAIT_ON_AVAIL_BUFFER:
4583         case PACKET3_ME_WRITE:
4584                 break;
4585         case PACKET3_COPY_DATA:
4586                 if ((idx_value & 0xf00) == 0) {
4587                         reg = ib[idx + 3] * 4;
4588                         if (!si_vm_reg_valid(reg))
4589                                 return -EINVAL;
4590                 }
4591                 break;
4592         case PACKET3_WRITE_DATA:
4593                 if ((idx_value & 0xf00) == 0) {
4594                         start_reg = ib[idx + 1] * 4;
4595                         if (idx_value & 0x10000) {
4596                                 if (!si_vm_reg_valid(start_reg))
4597                                         return -EINVAL;
4598                         } else {
4599                                 for (i = 0; i < (pkt->count - 2); i++) {
4600                                         reg = start_reg + (4 * i);
4601                                         if (!si_vm_reg_valid(reg))
4602                                                 return -EINVAL;
4603                                 }
4604                         }
4605                 }
4606                 break;
4607         case PACKET3_COND_WRITE:
4608                 if (idx_value & 0x100) {
4609                         reg = ib[idx + 5] * 4;
4610                         if (!si_vm_reg_valid(reg))
4611                                 return -EINVAL;
4612                 }
4613                 break;
4614         case PACKET3_COPY_DW:
4615                 if (idx_value & 0x2) {
4616                         reg = ib[idx + 3] * 4;
4617                         if (!si_vm_reg_valid(reg))
4618                                 return -EINVAL;
4619                 }
4620                 break;
4621         case PACKET3_SET_CONFIG_REG:
4622                 start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_START;
4623                 end_reg = 4 * pkt->count + start_reg - 4;
4624                 if ((start_reg < PACKET3_SET_CONFIG_REG_START) ||
4625                     (start_reg >= PACKET3_SET_CONFIG_REG_END) ||
4626                     (end_reg >= PACKET3_SET_CONFIG_REG_END)) {
4627                         DRM_ERROR("bad PACKET3_SET_CONFIG_REG\n");
4628                         return -EINVAL;
4629                 }
4630                 for (i = 0; i < pkt->count; i++) {
4631                         reg = start_reg + (4 * i);
4632                         if (!si_vm_reg_valid(reg))
4633                                 return -EINVAL;
4634                 }
4635                 break;
4636         case PACKET3_CP_DMA:
4637                 r = si_vm_packet3_cp_dma_check(ib, idx);
4638                 if (r)
4639                         return r;
4640                 break;
4641         default:
4642                 DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode);
4643                 return -EINVAL;
4644         }
4645         return 0;
4646 }
4647 
4648 static int si_vm_packet3_compute_check(struct radeon_device *rdev,
4649                                        u32 *ib, struct radeon_cs_packet *pkt)
4650 {
4651         int r;
4652         u32 idx = pkt->idx + 1;
4653         u32 idx_value = ib[idx];
4654         u32 start_reg, reg, i;
4655 
4656         switch (pkt->opcode) {
4657         case PACKET3_NOP:
4658         case PACKET3_SET_BASE:
4659         case PACKET3_CLEAR_STATE:
4660         case PACKET3_DISPATCH_DIRECT:
4661         case PACKET3_DISPATCH_INDIRECT:
4662         case PACKET3_ALLOC_GDS:
4663         case PACKET3_WRITE_GDS_RAM:
4664         case PACKET3_ATOMIC_GDS:
4665         case PACKET3_ATOMIC:
4666         case PACKET3_OCCLUSION_QUERY:
4667         case PACKET3_SET_PREDICATION:
4668         case PACKET3_COND_EXEC:
4669         case PACKET3_PRED_EXEC:
4670         case PACKET3_CONTEXT_CONTROL:
4671         case PACKET3_STRMOUT_BUFFER_UPDATE:
4672         case PACKET3_WAIT_REG_MEM:
4673         case PACKET3_MEM_WRITE:
4674         case PACKET3_PFP_SYNC_ME:
4675         case PACKET3_SURFACE_SYNC:
4676         case PACKET3_EVENT_WRITE:
4677         case PACKET3_EVENT_WRITE_EOP:
4678         case PACKET3_EVENT_WRITE_EOS:
4679         case PACKET3_SET_CONTEXT_REG:
4680         case PACKET3_SET_CONTEXT_REG_INDIRECT:
4681         case PACKET3_SET_SH_REG:
4682         case PACKET3_SET_SH_REG_OFFSET:
4683         case PACKET3_INCREMENT_DE_COUNTER:
4684         case PACKET3_WAIT_ON_CE_COUNTER:
4685         case PACKET3_WAIT_ON_AVAIL_BUFFER:
4686         case PACKET3_ME_WRITE:
4687                 break;
4688         case PACKET3_COPY_DATA:
4689                 if ((idx_value & 0xf00) == 0) {
4690                         reg = ib[idx + 3] * 4;
4691                         if (!si_vm_reg_valid(reg))
4692                                 return -EINVAL;
4693                 }
4694                 break;
4695         case PACKET3_WRITE_DATA:
4696                 if ((idx_value & 0xf00) == 0) {
4697                         start_reg = ib[idx + 1] * 4;
4698                         if (idx_value & 0x10000) {
4699                                 if (!si_vm_reg_valid(start_reg))
4700                                         return -EINVAL;
4701                         } else {
4702                                 for (i = 0; i < (pkt->count - 2); i++) {
4703                                         reg = start_reg + (4 * i);
4704                                         if (!si_vm_reg_valid(reg))
4705                                                 return -EINVAL;
4706                                 }
4707                         }
4708                 }
4709                 break;
4710         case PACKET3_COND_WRITE:
4711                 if (idx_value & 0x100) {
4712                         reg = ib[idx + 5] * 4;
4713                         if (!si_vm_reg_valid(reg))
4714                                 return -EINVAL;
4715                 }
4716                 break;
4717         case PACKET3_COPY_DW:
4718                 if (idx_value & 0x2) {
4719                         reg = ib[idx + 3] * 4;
4720                         if (!si_vm_reg_valid(reg))
4721                                 return -EINVAL;
4722                 }
4723                 break;
4724         case PACKET3_CP_DMA:
4725                 r = si_vm_packet3_cp_dma_check(ib, idx);
4726                 if (r)
4727                         return r;
4728                 break;
4729         default:
4730                 DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode);
4731                 return -EINVAL;
4732         }
4733         return 0;
4734 }
4735 
4736 int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
4737 {
4738         int ret = 0;
4739         u32 idx = 0, i;
4740         struct radeon_cs_packet pkt;
4741 
4742         do {
4743                 pkt.idx = idx;
4744                 pkt.type = RADEON_CP_PACKET_GET_TYPE(ib->ptr[idx]);
4745                 pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]);
4746                 pkt.one_reg_wr = 0;
4747                 switch (pkt.type) {
4748                 case RADEON_PACKET_TYPE0:
4749                         dev_err(rdev->dev, "Packet0 not allowed!\n");
4750                         ret = -EINVAL;
4751                         break;
4752                 case RADEON_PACKET_TYPE2:
4753                         idx += 1;
4754                         break;
4755                 case RADEON_PACKET_TYPE3:
4756                         pkt.opcode = RADEON_CP_PACKET3_GET_OPCODE(ib->ptr[idx]);
4757                         if (ib->is_const_ib)
4758                                 ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt);
4759                         else {
4760                                 switch (ib->ring) {
4761                                 case RADEON_RING_TYPE_GFX_INDEX:
4762                                         ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt);
4763                                         break;
4764                                 case CAYMAN_RING_TYPE_CP1_INDEX:
4765                                 case CAYMAN_RING_TYPE_CP2_INDEX:
4766                                         ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt);
4767                                         break;
4768                                 default:
4769                                         dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->ring);
4770                                         ret = -EINVAL;
4771                                         break;
4772                                 }
4773                         }
4774                         idx += pkt.count + 2;
4775                         break;
4776                 default:
4777                         dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type);
4778                         ret = -EINVAL;
4779                         break;
4780                 }
4781                 if (ret) {
4782                         for (i = 0; i < ib->length_dw; i++) {
4783                                 if (i == idx)
4784                                         printk("\t0x%08x <---\n", ib->ptr[i]);
4785                                 else
4786                                         printk("\t0x%08x\n", ib->ptr[i]);
4787                         }
4788                         break;
4789                 }
4790         } while (idx < ib->length_dw);
4791 
4792         return ret;
4793 }
4794 
4795 /*
4796  * vm
4797  */
4798 int si_vm_init(struct radeon_device *rdev)
4799 {
4800         /* number of VMs */
4801         rdev->vm_manager.nvm = 16;
4802         /* base offset of vram pages */
4803         rdev->vm_manager.vram_base_offset = 0;
4804 
4805         return 0;
4806 }
4807 
4808 void si_vm_fini(struct radeon_device *rdev)
4809 {
4810 }
4811 
4812 /**
4813  * si_vm_decode_fault - print human readable fault info
4814  *
4815  * @rdev: radeon_device pointer
4816  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
4817  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
4818  *
4819  * Print human readable fault information (SI).
4820  */
4821 static void si_vm_decode_fault(struct radeon_device *rdev,
4822                                u32 status, u32 addr)
4823 {
4824         u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
4825         u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
4826         u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
4827         char *block;
4828 
4829         if (rdev->family == CHIP_TAHITI) {
4830                 switch (mc_id) {
4831                 case 160:
4832                 case 144:
4833                 case 96:
4834                 case 80:
4835                 case 224:
4836                 case 208:
4837                 case 32:
4838                 case 16:
4839                         block = "CB";
4840                         break;
4841                 case 161:
4842                 case 145:
4843                 case 97:
4844                 case 81:
4845                 case 225:
4846                 case 209:
4847                 case 33:
4848                 case 17:
4849                         block = "CB_FMASK";
4850                         break;
4851                 case 162:
4852                 case 146:
4853                 case 98:
4854                 case 82:
4855                 case 226:
4856                 case 210:
4857                 case 34:
4858                 case 18:
4859                         block = "CB_CMASK";
4860                         break;
4861                 case 163:
4862                 case 147:
4863                 case 99:
4864                 case 83:
4865                 case 227:
4866                 case 211:
4867                 case 35:
4868                 case 19:
4869                         block = "CB_IMMED";
4870                         break;
4871                 case 164:
4872                 case 148:
4873                 case 100:
4874                 case 84:
4875                 case 228:
4876                 case 212:
4877                 case 36:
4878                 case 20:
4879                         block = "DB";
4880                         break;
4881                 case 165:
4882                 case 149:
4883                 case 101:
4884                 case 85:
4885                 case 229:
4886                 case 213:
4887                 case 37:
4888                 case 21:
4889                         block = "DB_HTILE";
4890                         break;
4891                 case 167:
4892                 case 151:
4893                 case 103:
4894                 case 87:
4895                 case 231:
4896                 case 215:
4897                 case 39:
4898                 case 23:
4899                         block = "DB_STEN";
4900                         break;
4901                 case 72:
4902                 case 68:
4903                 case 64:
4904                 case 8:
4905                 case 4:
4906                 case 0:
4907                 case 136:
4908                 case 132:
4909                 case 128:
4910                 case 200:
4911                 case 196:
4912                 case 192:
4913                         block = "TC";
4914                         break;
4915                 case 112:
4916                 case 48:
4917                         block = "CP";
4918                         break;
4919                 case 49:
4920                 case 177:
4921                 case 50:
4922                 case 178:
4923                         block = "SH";
4924                         break;
4925                 case 53:
4926                 case 190:
4927                         block = "VGT";
4928                         break;
4929                 case 117:
4930                         block = "IH";
4931                         break;
4932                 case 51:
4933                 case 115:
4934                         block = "RLC";
4935                         break;
4936                 case 119:
4937                 case 183:
4938                         block = "DMA0";
4939                         break;
4940                 case 61:
4941                         block = "DMA1";
4942                         break;
4943                 case 248:
4944                 case 120:
4945                         block = "HDP";
4946                         break;
4947                 default:
4948                         block = "unknown";
4949                         break;
4950                 }
4951         } else {
4952                 switch (mc_id) {
4953                 case 32:
4954                 case 16:
4955                 case 96:
4956                 case 80:
4957                 case 160:
4958                 case 144:
4959                 case 224:
4960                 case 208:
4961                         block = "CB";
4962                         break;
4963                 case 33:
4964                 case 17:
4965                 case 97:
4966                 case 81:
4967                 case 161:
4968                 case 145:
4969                 case 225:
4970                 case 209:
4971                         block = "CB_FMASK";
4972                         break;
4973                 case 34:
4974                 case 18:
4975                 case 98:
4976                 case 82:
4977                 case 162:
4978                 case 146:
4979                 case 226:
4980                 case 210:
4981                         block = "CB_CMASK";
4982                         break;
4983                 case 35:
4984                 case 19:
4985                 case 99:
4986                 case 83:
4987                 case 163:
4988                 case 147:
4989                 case 227:
4990                 case 211:
4991                         block = "CB_IMMED";
4992                         break;
4993                 case 36:
4994                 case 20:
4995                 case 100:
4996                 case 84:
4997                 case 164:
4998                 case 148:
4999                 case 228:
5000                 case 212:
5001                         block = "DB";
5002                         break;
5003                 case 37:
5004                 case 21:
5005                 case 101:
5006                 case 85:
5007                 case 165:
5008                 case 149:
5009                 case 229:
5010                 case 213:
5011                         block = "DB_HTILE";
5012                         break;
5013                 case 39:
5014                 case 23:
5015                 case 103:
5016                 case 87:
5017                 case 167:
5018                 case 151:
5019                 case 231:
5020                 case 215:
5021                         block = "DB_STEN";
5022                         break;
5023                 case 72:
5024                 case 68:
5025                 case 8:
5026                 case 4:
5027                 case 136:
5028                 case 132:
5029                 case 200:
5030                 case 196:
5031                         block = "TC";
5032                         break;
5033                 case 112:
5034                 case 48:
5035                         block = "CP";
5036                         break;
5037                 case 49:
5038                 case 177:
5039                 case 50:
5040                 case 178:
5041                         block = "SH";
5042                         break;
5043                 case 53:
5044                         block = "VGT";
5045                         break;
5046                 case 117:
5047                         block = "IH";
5048                         break;
5049                 case 51:
5050                 case 115:
5051                         block = "RLC";
5052                         break;
5053                 case 119:
5054                 case 183:
5055                         block = "DMA0";
5056                         break;
5057                 case 61:
5058                         block = "DMA1";
5059                         break;
5060                 case 248:
5061                 case 120:
5062                         block = "HDP";
5063                         break;
5064                 default:
5065                         block = "unknown";
5066                         break;
5067                 }
5068         }
5069 
5070         printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
5071                protections, vmid, addr,
5072                (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
5073                block, mc_id);
5074 }
5075 
5076 void si_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
5077                  unsigned vm_id, uint64_t pd_addr)
5078 {
5079         /* write new base address */
5080         radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5081         radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
5082                                  WRITE_DATA_DST_SEL(0)));
5083 
5084         if (vm_id < 8) {
5085                 radeon_ring_write(ring,
5086                                   (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2);
5087         } else {
5088                 radeon_ring_write(ring,
5089                                   (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm_id - 8) << 2)) >> 2);
5090         }
5091         radeon_ring_write(ring, 0);
5092         radeon_ring_write(ring, pd_addr >> 12);
5093 
5094         /* flush hdp cache */
5095         radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5096         radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
5097                                  WRITE_DATA_DST_SEL(0)));
5098         radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
5099         radeon_ring_write(ring, 0);
5100         radeon_ring_write(ring, 0x1);
5101 
5102         /* bits 0-15 are the VM contexts0-15 */
5103         radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5104         radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
5105                                  WRITE_DATA_DST_SEL(0)));
5106         radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5107         radeon_ring_write(ring, 0);
5108         radeon_ring_write(ring, 1 << vm_id);
5109 
5110         /* wait for the invalidate to complete */
5111         radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
5112         radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) |  /* always */
5113                                  WAIT_REG_MEM_ENGINE(0))); /* me */
5114         radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5115         radeon_ring_write(ring, 0);
5116         radeon_ring_write(ring, 0); /* ref */
5117         radeon_ring_write(ring, 0); /* mask */
5118         radeon_ring_write(ring, 0x20); /* poll interval */
5119 
5120         /* sync PFP to ME, otherwise we might get invalid PFP reads */
5121         radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
5122         radeon_ring_write(ring, 0x0);
5123 }
5124 
5125 /*
5126  *  Power and clock gating
5127  */
5128 static void si_wait_for_rlc_serdes(struct radeon_device *rdev)
5129 {
5130         int i;
5131 
5132         for (i = 0; i < rdev->usec_timeout; i++) {
5133                 if (RREG32(RLC_SERDES_MASTER_BUSY_0) == 0)
5134                         break;
5135                 udelay(1);
5136         }
5137 
5138         for (i = 0; i < rdev->usec_timeout; i++) {
5139                 if (RREG32(RLC_SERDES_MASTER_BUSY_1) == 0)
5140                         break;
5141                 udelay(1);
5142         }
5143 }
5144 
5145 static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
5146                                          bool enable)
5147 {
5148         u32 tmp = RREG32(CP_INT_CNTL_RING0);
5149         u32 mask;
5150         int i;
5151 
5152         if (enable)
5153                 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5154         else
5155                 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5156         WREG32(CP_INT_CNTL_RING0, tmp);
5157 
5158         if (!enable) {
5159                 /* read a gfx register */
5160                 tmp = RREG32(DB_DEPTH_INFO);
5161 
5162                 mask = RLC_BUSY_STATUS | GFX_POWER_STATUS | GFX_CLOCK_STATUS | GFX_LS_STATUS;
5163                 for (i = 0; i < rdev->usec_timeout; i++) {
5164                         if ((RREG32(RLC_STAT) & mask) == (GFX_CLOCK_STATUS | GFX_POWER_STATUS))
5165                                 break;
5166                         udelay(1);
5167                 }
5168         }
5169 }
5170 
5171 static void si_set_uvd_dcm(struct radeon_device *rdev,
5172                            bool sw_mode)
5173 {
5174         u32 tmp, tmp2;
5175 
5176         tmp = RREG32(UVD_CGC_CTRL);
5177         tmp &= ~(CLK_OD_MASK | CG_DT_MASK);
5178         tmp |= DCM | CG_DT(1) | CLK_OD(4);
5179 
5180         if (sw_mode) {
5181                 tmp &= ~0x7ffff800;
5182                 tmp2 = DYN_OR_EN | DYN_RR_EN | G_DIV_ID(7);
5183         } else {
5184                 tmp |= 0x7ffff800;
5185                 tmp2 = 0;
5186         }
5187 
5188         WREG32(UVD_CGC_CTRL, tmp);
5189         WREG32_UVD_CTX(UVD_CGC_CTRL2, tmp2);
5190 }
5191 
5192 void si_init_uvd_internal_cg(struct radeon_device *rdev)
5193 {
5194         bool hw_mode = true;
5195 
5196         if (hw_mode) {
5197                 si_set_uvd_dcm(rdev, false);
5198         } else {
5199                 u32 tmp = RREG32(UVD_CGC_CTRL);
5200                 tmp &= ~DCM;
5201                 WREG32(UVD_CGC_CTRL, tmp);
5202         }
5203 }
5204 
5205 static u32 si_halt_rlc(struct radeon_device *rdev)
5206 {
5207         u32 data, orig;
5208 
5209         orig = data = RREG32(RLC_CNTL);
5210 
5211         if (data & RLC_ENABLE) {
5212                 data &= ~RLC_ENABLE;
5213                 WREG32(RLC_CNTL, data);
5214 
5215                 si_wait_for_rlc_serdes(rdev);
5216         }
5217 
5218         return orig;
5219 }
5220 
5221 static void si_update_rlc(struct radeon_device *rdev, u32 rlc)
5222 {
5223         u32 tmp;
5224 
5225         tmp = RREG32(RLC_CNTL);
5226         if (tmp != rlc)
5227                 WREG32(RLC_CNTL, rlc);
5228 }
5229 
5230 static void si_enable_dma_pg(struct radeon_device *rdev, bool enable)
5231 {
5232         u32 data, orig;
5233 
5234         orig = data = RREG32(DMA_PG);
5235         if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA))
5236                 data |= PG_CNTL_ENABLE;
5237         else
5238                 data &= ~PG_CNTL_ENABLE;
5239         if (orig != data)
5240                 WREG32(DMA_PG, data);
5241 }
5242 
5243 static void si_init_dma_pg(struct radeon_device *rdev)
5244 {
5245         u32 tmp;
5246 
5247         WREG32(DMA_PGFSM_WRITE,  0x00002000);
5248         WREG32(DMA_PGFSM_CONFIG, 0x100010ff);
5249 
5250         for (tmp = 0; tmp < 5; tmp++)
5251                 WREG32(DMA_PGFSM_WRITE, 0);
5252 }
5253 
5254 static void si_enable_gfx_cgpg(struct radeon_device *rdev,
5255                                bool enable)
5256 {
5257         u32 tmp;
5258 
5259         if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
5260                 tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10);
5261                 WREG32(RLC_TTOP_D, tmp);
5262 
5263                 tmp = RREG32(RLC_PG_CNTL);
5264                 tmp |= GFX_PG_ENABLE;
5265                 WREG32(RLC_PG_CNTL, tmp);
5266 
5267                 tmp = RREG32(RLC_AUTO_PG_CTRL);
5268                 tmp |= AUTO_PG_EN;
5269                 WREG32(RLC_AUTO_PG_CTRL, tmp);
5270         } else {
5271                 tmp = RREG32(RLC_AUTO_PG_CTRL);
5272                 tmp &= ~AUTO_PG_EN;
5273                 WREG32(RLC_AUTO_PG_CTRL, tmp);
5274 
5275                 tmp = RREG32(DB_RENDER_CONTROL);
5276         }
5277 }
5278 
5279 static void si_init_gfx_cgpg(struct radeon_device *rdev)
5280 {
5281         u32 tmp;
5282 
5283         WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5284 
5285         tmp = RREG32(RLC_PG_CNTL);
5286         tmp |= GFX_PG_SRC;
5287         WREG32(RLC_PG_CNTL, tmp);
5288 
5289         WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
5290 
5291         tmp = RREG32(RLC_AUTO_PG_CTRL);
5292 
5293         tmp &= ~GRBM_REG_SGIT_MASK;
5294         tmp |= GRBM_REG_SGIT(0x700);
5295         tmp &= ~PG_AFTER_GRBM_REG_ST_MASK;
5296         WREG32(RLC_AUTO_PG_CTRL, tmp);
5297 }
5298 
5299 static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
5300 {
5301         u32 mask = 0, tmp, tmp1;
5302         int i;
5303 
5304         si_select_se_sh(rdev, se, sh);
5305         tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
5306         tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
5307         si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5308 
5309         tmp &= 0xffff0000;
5310 
5311         tmp |= tmp1;
5312         tmp >>= 16;
5313 
5314         for (i = 0; i < rdev->config.si.max_cu_per_sh; i ++) {
5315                 mask <<= 1;
5316                 mask |= 1;
5317         }
5318 
5319         return (~tmp) & mask;
5320 }
5321 
5322 static void si_init_ao_cu_mask(struct radeon_device *rdev)
5323 {
5324         u32 i, j, k, active_cu_number = 0;
5325         u32 mask, counter, cu_bitmap;
5326         u32 tmp = 0;
5327 
5328         for (i = 0; i < rdev->config.si.max_shader_engines; i++) {
5329                 for (j = 0; j < rdev->config.si.max_sh_per_se; j++) {
5330                         mask = 1;
5331                         cu_bitmap = 0;
5332                         counter  = 0;
5333                         for (k = 0; k < rdev->config.si.max_cu_per_sh; k++) {
5334                                 if (si_get_cu_active_bitmap(rdev, i, j) & mask) {
5335                                         if (counter < 2)
5336                                                 cu_bitmap |= mask;
5337                                         counter++;
5338                                 }
5339                                 mask <<= 1;
5340                         }
5341 
5342                         active_cu_number += counter;
5343                         tmp |= (cu_bitmap << (i * 16 + j * 8));
5344                 }
5345         }
5346 
5347         WREG32(RLC_PG_AO_CU_MASK, tmp);
5348 
5349         tmp = RREG32(RLC_MAX_PG_CU);
5350         tmp &= ~MAX_PU_CU_MASK;
5351         tmp |= MAX_PU_CU(active_cu_number);
5352         WREG32(RLC_MAX_PG_CU, tmp);
5353 }
5354 
5355 static void si_enable_cgcg(struct radeon_device *rdev,
5356                            bool enable)
5357 {
5358         u32 data, orig, tmp;
5359 
5360         orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
5361 
5362         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
5363                 si_enable_gui_idle_interrupt(rdev, true);
5364 
5365                 WREG32(RLC_GCPM_GENERAL_3, 0x00000080);
5366 
5367                 tmp = si_halt_rlc(rdev);
5368 
5369                 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
5370                 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
5371                 WREG32(RLC_SERDES_WR_CTRL, 0x00b000ff);
5372 
5373                 si_wait_for_rlc_serdes(rdev);
5374 
5375                 si_update_rlc(rdev, tmp);
5376 
5377                 WREG32(RLC_SERDES_WR_CTRL, 0x007000ff);
5378 
5379                 data |= CGCG_EN | CGLS_EN;
5380         } else {
5381                 si_enable_gui_idle_interrupt(rdev, false);
5382 
5383                 RREG32(CB_CGTT_SCLK_CTRL);
5384                 RREG32(CB_CGTT_SCLK_CTRL);
5385                 RREG32(CB_CGTT_SCLK_CTRL);
5386                 RREG32(CB_CGTT_SCLK_CTRL);
5387 
5388                 data &= ~(CGCG_EN | CGLS_EN);
5389         }
5390 
5391         if (orig != data)
5392                 WREG32(RLC_CGCG_CGLS_CTRL, data);
5393 }
5394 
5395 static void si_enable_mgcg(struct radeon_device *rdev,
5396                            bool enable)
5397 {
5398         u32 data, orig, tmp = 0;
5399 
5400         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
5401                 orig = data = RREG32(CGTS_SM_CTRL_REG);
5402                 data = 0x96940200;
5403                 if (orig != data)
5404                         WREG32(CGTS_SM_CTRL_REG, data);
5405 
5406                 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
5407                         orig = data = RREG32(CP_MEM_SLP_CNTL);
5408                         data |= CP_MEM_LS_EN;
5409                         if (orig != data)
5410                                 WREG32(CP_MEM_SLP_CNTL, data);
5411                 }
5412 
5413                 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5414                 data &= 0xffffffc0;
5415                 if (orig != data)
5416                         WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5417 
5418                 tmp = si_halt_rlc(rdev);
5419 
5420                 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
5421                 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
5422                 WREG32(RLC_SERDES_WR_CTRL, 0x00d000ff);
5423 
5424                 si_update_rlc(rdev, tmp);
5425         } else {
5426                 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5427                 data |= 0x00000003;
5428                 if (orig != data)
5429                         WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5430 
5431                 data = RREG32(CP_MEM_SLP_CNTL);
5432                 if (data & CP_MEM_LS_EN) {
5433                         data &= ~CP_MEM_LS_EN;
5434                         WREG32(CP_MEM_SLP_CNTL, data);
5435                 }
5436                 orig = data = RREG32(CGTS_SM_CTRL_REG);
5437                 data |= LS_OVERRIDE | OVERRIDE;
5438                 if (orig != data)
5439                         WREG32(CGTS_SM_CTRL_REG, data);
5440 
5441                 tmp = si_halt_rlc(rdev);
5442 
5443                 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
5444                 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
5445                 WREG32(RLC_SERDES_WR_CTRL, 0x00e000ff);
5446 
5447                 si_update_rlc(rdev, tmp);
5448         }
5449 }
5450 
5451 static void si_enable_uvd_mgcg(struct radeon_device *rdev,
5452                                bool enable)
5453 {
5454         u32 orig, data, tmp;
5455 
5456         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
5457                 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5458                 tmp |= 0x3fff;
5459                 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp);
5460 
5461                 orig = data = RREG32(UVD_CGC_CTRL);
5462                 data |= DCM;
5463                 if (orig != data)
5464                         WREG32(UVD_CGC_CTRL, data);
5465 
5466                 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0);
5467                 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0);
5468         } else {
5469                 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5470                 tmp &= ~0x3fff;
5471                 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp);
5472 
5473                 orig = data = RREG32(UVD_CGC_CTRL);
5474                 data &= ~DCM;
5475                 if (orig != data)
5476                         WREG32(UVD_CGC_CTRL, data);
5477 
5478                 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0xffffffff);
5479                 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0xffffffff);
5480         }
5481 }
5482 
5483 static const u32 mc_cg_registers[] =
5484 {
5485         MC_HUB_MISC_HUB_CG,
5486         MC_HUB_MISC_SIP_CG,
5487         MC_HUB_MISC_VM_CG,
5488         MC_XPB_CLK_GAT,
5489         ATC_MISC_CG,
5490         MC_CITF_MISC_WR_CG,
5491         MC_CITF_MISC_RD_CG,
5492         MC_CITF_MISC_VM_CG,
5493         VM_L2_CG,
5494 };
5495 
5496 static void si_enable_mc_ls(struct radeon_device *rdev,
5497                             bool enable)
5498 {
5499         int i;
5500         u32 orig, data;
5501 
5502         for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5503                 orig = data = RREG32(mc_cg_registers[i]);
5504                 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
5505                         data |= MC_LS_ENABLE;
5506                 else
5507                         data &= ~MC_LS_ENABLE;
5508                 if (data != orig)
5509                         WREG32(mc_cg_registers[i], data);
5510         }
5511 }
5512 
5513 static void si_enable_mc_mgcg(struct radeon_device *rdev,
5514                                bool enable)
5515 {
5516         int i;
5517         u32 orig, data;
5518 
5519         for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5520                 orig = data = RREG32(mc_cg_registers[i]);
5521                 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
5522                         data |= MC_CG_ENABLE;
5523                 else
5524                         data &= ~MC_CG_ENABLE;
5525                 if (data != orig)
5526                         WREG32(mc_cg_registers[i], data);
5527         }
5528 }
5529 
5530 static void si_enable_dma_mgcg(struct radeon_device *rdev,
5531                                bool enable)
5532 {
5533         u32 orig, data, offset;
5534         int i;
5535 
5536         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
5537                 for (i = 0; i < 2; i++) {
5538                         if (i == 0)
5539                                 offset = DMA0_REGISTER_OFFSET;
5540                         else
5541                                 offset = DMA1_REGISTER_OFFSET;
5542                         orig = data = RREG32(DMA_POWER_CNTL + offset);
5543                         data &= ~MEM_POWER_OVERRIDE;
5544                         if (data != orig)
5545                                 WREG32(DMA_POWER_CNTL + offset, data);
5546                         WREG32(DMA_CLK_CTRL + offset, 0x00000100);
5547                 }
5548         } else {
5549                 for (i = 0; i < 2; i++) {
5550                         if (i == 0)
5551                                 offset = DMA0_REGISTER_OFFSET;
5552                         else
5553                                 offset = DMA1_REGISTER_OFFSET;
5554                         orig = data = RREG32(DMA_POWER_CNTL + offset);
5555                         data |= MEM_POWER_OVERRIDE;
5556                         if (data != orig)
5557                                 WREG32(DMA_POWER_CNTL + offset, data);
5558 
5559                         orig = data = RREG32(DMA_CLK_CTRL + offset);
5560                         data = 0xff000000;
5561                         if (data != orig)
5562                                 WREG32(DMA_CLK_CTRL + offset, data);
5563                 }
5564         }
5565 }
5566 
5567 static void si_enable_bif_mgls(struct radeon_device *rdev,
5568                                bool enable)
5569 {
5570         u32 orig, data;
5571 
5572         orig = data = RREG32_PCIE(PCIE_CNTL2);
5573 
5574         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
5575                 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
5576                         REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
5577         else
5578                 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
5579                           REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
5580 
5581         if (orig != data)
5582                 WREG32_PCIE(PCIE_CNTL2, data);
5583 }
5584 
5585 static void si_enable_hdp_mgcg(struct radeon_device *rdev,
5586                                bool enable)
5587 {
5588         u32 orig, data;
5589 
5590         orig = data = RREG32(HDP_HOST_PATH_CNTL);
5591 
5592         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
5593                 data &= ~CLOCK_GATING_DIS;
5594         else
5595                 data |= CLOCK_GATING_DIS;
5596 
5597         if (orig != data)
5598                 WREG32(HDP_HOST_PATH_CNTL, data);
5599 }
5600 
5601 static void si_enable_hdp_ls(struct radeon_device *rdev,
5602                              bool enable)
5603 {
5604         u32 orig, data;
5605 
5606         orig = data = RREG32(HDP_MEM_POWER_LS);
5607 
5608         if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
5609                 data |= HDP_LS_ENABLE;
5610         else
5611                 data &= ~HDP_LS_ENABLE;
5612 
5613         if (orig != data)
5614                 WREG32(HDP_MEM_POWER_LS, data);
5615 }
5616 
5617 static void si_update_cg(struct radeon_device *rdev,
5618                          u32 block, bool enable)
5619 {
5620         if (block & RADEON_CG_BLOCK_GFX) {
5621                 si_enable_gui_idle_interrupt(rdev, false);
5622                 /* order matters! */
5623                 if (enable) {
5624                         si_enable_mgcg(rdev, true);
5625                         si_enable_cgcg(rdev, true);
5626                 } else {
5627                         si_enable_cgcg(rdev, false);
5628                         si_enable_mgcg(rdev, false);
5629                 }
5630                 si_enable_gui_idle_interrupt(rdev, true);
5631         }
5632 
5633         if (block & RADEON_CG_BLOCK_MC) {
5634                 si_enable_mc_mgcg(rdev, enable);
5635                 si_enable_mc_ls(rdev, enable);
5636         }
5637 
5638         if (block & RADEON_CG_BLOCK_SDMA) {
5639                 si_enable_dma_mgcg(rdev, enable);
5640         }
5641 
5642         if (block & RADEON_CG_BLOCK_BIF) {
5643                 si_enable_bif_mgls(rdev, enable);
5644         }
5645 
5646         if (block & RADEON_CG_BLOCK_UVD) {
5647                 if (rdev->has_uvd) {
5648                         si_enable_uvd_mgcg(rdev, enable);
5649                 }
5650         }
5651 
5652         if (block & RADEON_CG_BLOCK_HDP) {
5653                 si_enable_hdp_mgcg(rdev, enable);
5654                 si_enable_hdp_ls(rdev, enable);
5655         }
5656 }
5657 
5658 static void si_init_cg(struct radeon_device *rdev)
5659 {
5660         si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5661                             RADEON_CG_BLOCK_MC |
5662                             RADEON_CG_BLOCK_SDMA |
5663                             RADEON_CG_BLOCK_BIF |
5664                             RADEON_CG_BLOCK_HDP), true);
5665         if (rdev->has_uvd) {
5666                 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true);
5667                 si_init_uvd_internal_cg(rdev);
5668         }
5669 }
5670 
5671 static void si_fini_cg(struct radeon_device *rdev)
5672 {
5673         if (rdev->has_uvd) {
5674                 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, false);
5675         }
5676         si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5677                             RADEON_CG_BLOCK_MC |
5678                             RADEON_CG_BLOCK_SDMA |
5679                             RADEON_CG_BLOCK_BIF |
5680                             RADEON_CG_BLOCK_HDP), false);
5681 }
5682 
5683 u32 si_get_csb_size(struct radeon_device *rdev)
5684 {
5685         u32 count = 0;
5686         const struct cs_section_def *sect = NULL;
5687         const struct cs_extent_def *ext = NULL;
5688 
5689         if (rdev->rlc.cs_data == NULL)
5690                 return 0;
5691 
5692         /* begin clear state */
5693         count += 2;
5694         /* context control state */
5695         count += 3;
5696 
5697         for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5698                 for (ext = sect->section; ext->extent != NULL; ++ext) {
5699                         if (sect->id == SECT_CONTEXT)
5700                                 count += 2 + ext->reg_count;
5701                         else
5702                                 return 0;
5703                 }
5704         }
5705         /* pa_sc_raster_config */
5706         count += 3;
5707         /* end clear state */
5708         count += 2;
5709         /* clear state */
5710         count += 2;
5711 
5712         return count;
5713 }
5714 
5715 void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
5716 {
5717         u32 count = 0, i;
5718         const struct cs_section_def *sect = NULL;
5719         const struct cs_extent_def *ext = NULL;
5720 
5721         if (rdev->rlc.cs_data == NULL)
5722                 return;
5723         if (buffer == NULL)
5724                 return;
5725 
5726         buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5727         buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
5728 
5729         buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
5730         buffer[count++] = cpu_to_le32(0x80000000);
5731         buffer[count++] = cpu_to_le32(0x80000000);
5732 
5733         for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5734                 for (ext = sect->section; ext->extent != NULL; ++ext) {
5735                         if (sect->id == SECT_CONTEXT) {
5736                                 buffer[count++] =
5737                                         cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
5738                                 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
5739                                 for (i = 0; i < ext->reg_count; i++)
5740                                         buffer[count++] = cpu_to_le32(ext->extent[i]);
5741                         } else {
5742                                 return;
5743                         }
5744                 }
5745         }
5746 
5747         buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1));
5748         buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
5749         switch (rdev->family) {
5750         case CHIP_TAHITI:
5751         case CHIP_PITCAIRN:
5752                 buffer[count++] = cpu_to_le32(0x2a00126a);
5753                 break;
5754         case CHIP_VERDE:
5755                 buffer[count++] = cpu_to_le32(0x0000124a);
5756                 break;
5757         case CHIP_OLAND:
5758                 buffer[count++] = cpu_to_le32(0x00000082);
5759                 break;
5760         case CHIP_HAINAN:
5761                 buffer[count++] = cpu_to_le32(0x00000000);
5762                 break;
5763         default:
5764                 buffer[count++] = cpu_to_le32(0x00000000);
5765                 break;
5766         }
5767 
5768         buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5769         buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
5770 
5771         buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
5772         buffer[count++] = cpu_to_le32(0);
5773 }
5774 
5775 static void si_init_pg(struct radeon_device *rdev)
5776 {
5777         if (rdev->pg_flags) {
5778                 if (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA) {
5779                         si_init_dma_pg(rdev);
5780                 }
5781                 si_init_ao_cu_mask(rdev);
5782                 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
5783                         si_init_gfx_cgpg(rdev);
5784                 } else {
5785                         WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5786                         WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
5787                 }
5788                 si_enable_dma_pg(rdev, true);
5789                 si_enable_gfx_cgpg(rdev, true);
5790         } else {
5791                 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5792                 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
5793         }
5794 }
5795 
5796 static void si_fini_pg(struct radeon_device *rdev)
5797 {
5798         if (rdev->pg_flags) {
5799                 si_enable_dma_pg(rdev, false);
5800                 si_enable_gfx_cgpg(rdev, false);
5801         }
5802 }
5803 
5804 /*
5805  * RLC
5806  */
5807 void si_rlc_reset(struct radeon_device *rdev)
5808 {
5809         u32 tmp = RREG32(GRBM_SOFT_RESET);
5810 
5811         tmp |= SOFT_RESET_RLC;
5812         WREG32(GRBM_SOFT_RESET, tmp);
5813         udelay(50);
5814         tmp &= ~SOFT_RESET_RLC;
5815         WREG32(GRBM_SOFT_RESET, tmp);
5816         udelay(50);
5817 }
5818 
5819 static void si_rlc_stop(struct radeon_device *rdev)
5820 {
5821         WREG32(RLC_CNTL, 0);
5822 
5823         si_enable_gui_idle_interrupt(rdev, false);
5824 
5825         si_wait_for_rlc_serdes(rdev);
5826 }
5827 
5828 static void si_rlc_start(struct radeon_device *rdev)
5829 {
5830         WREG32(RLC_CNTL, RLC_ENABLE);
5831 
5832         si_enable_gui_idle_interrupt(rdev, true);
5833 
5834         udelay(50);
5835 }
5836 
5837 static bool si_lbpw_supported(struct radeon_device *rdev)
5838 {
5839         u32 tmp;
5840 
5841         /* Enable LBPW only for DDR3 */
5842         tmp = RREG32(MC_SEQ_MISC0);
5843         if ((tmp & 0xF0000000) == 0xB0000000)
5844                 return true;
5845         return false;
5846 }
5847 
5848 static void si_enable_lbpw(struct radeon_device *rdev, bool enable)
5849 {
5850         u32 tmp;
5851 
5852         tmp = RREG32(RLC_LB_CNTL);
5853         if (enable)
5854                 tmp |= LOAD_BALANCE_ENABLE;
5855         else
5856                 tmp &= ~LOAD_BALANCE_ENABLE;
5857         WREG32(RLC_LB_CNTL, tmp);
5858 
5859         if (!enable) {
5860                 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5861                 WREG32(SPI_LB_CU_MASK, 0x00ff);
5862         }
5863 }
5864 
5865 static int si_rlc_resume(struct radeon_device *rdev)
5866 {
5867         u32 i;
5868 
5869         if (!rdev->rlc_fw)
5870                 return -EINVAL;
5871 
5872         si_rlc_stop(rdev);
5873 
5874         si_rlc_reset(rdev);
5875 
5876         si_init_pg(rdev);
5877 
5878         si_init_cg(rdev);
5879 
5880         WREG32(RLC_RL_BASE, 0);
5881         WREG32(RLC_RL_SIZE, 0);
5882         WREG32(RLC_LB_CNTL, 0);
5883         WREG32(RLC_LB_CNTR_MAX, 0xffffffff);
5884         WREG32(RLC_LB_CNTR_INIT, 0);
5885         WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
5886 
5887         WREG32(RLC_MC_CNTL, 0);
5888         WREG32(RLC_UCODE_CNTL, 0);
5889 
5890         if (rdev->new_fw) {
5891                 const struct rlc_firmware_header_v1_0 *hdr =
5892                         (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
5893                 u32 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
5894                 const __le32 *fw_data = (const __le32 *)
5895                         (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
5896 
5897                 radeon_ucode_print_rlc_hdr(&hdr->header);
5898 
5899                 for (i = 0; i < fw_size; i++) {
5900                         WREG32(RLC_UCODE_ADDR, i);
5901                         WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++));
5902                 }
5903         } else {
5904                 const __be32 *fw_data =
5905                         (const __be32 *)rdev->rlc_fw->data;
5906                 for (i = 0; i < SI_RLC_UCODE_SIZE; i++) {
5907                         WREG32(RLC_UCODE_ADDR, i);
5908                         WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
5909                 }
5910         }
5911         WREG32(RLC_UCODE_ADDR, 0);
5912 
5913         si_enable_lbpw(rdev, si_lbpw_supported(rdev));
5914 
5915         si_rlc_start(rdev);
5916 
5917         return 0;
5918 }
5919 
5920 static void si_enable_interrupts(struct radeon_device *rdev)
5921 {
5922         u32 ih_cntl = RREG32(IH_CNTL);
5923         u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5924 
5925         ih_cntl |= ENABLE_INTR;
5926         ih_rb_cntl |= IH_RB_ENABLE;
5927         WREG32(IH_CNTL, ih_cntl);
5928         WREG32(IH_RB_CNTL, ih_rb_cntl);
5929         rdev->ih.enabled = true;
5930 }
5931 
5932 static void si_disable_interrupts(struct radeon_device *rdev)
5933 {
5934         u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5935         u32 ih_cntl = RREG32(IH_CNTL);
5936 
5937         ih_rb_cntl &= ~IH_RB_ENABLE;
5938         ih_cntl &= ~ENABLE_INTR;
5939         WREG32(IH_RB_CNTL, ih_rb_cntl);
5940         WREG32(IH_CNTL, ih_cntl);
5941         /* set rptr, wptr to 0 */
5942         WREG32(IH_RB_RPTR, 0);
5943         WREG32(IH_RB_WPTR, 0);
5944         rdev->ih.enabled = false;
5945         rdev->ih.rptr = 0;
5946 }
5947 
5948 static void si_disable_interrupt_state(struct radeon_device *rdev)
5949 {
5950         int i;
5951         u32 tmp;
5952 
5953         tmp = RREG32(CP_INT_CNTL_RING0) &
5954                 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5955         WREG32(CP_INT_CNTL_RING0, tmp);
5956         WREG32(CP_INT_CNTL_RING1, 0);
5957         WREG32(CP_INT_CNTL_RING2, 0);
5958         tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5959         WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp);
5960         tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5961         WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
5962         WREG32(GRBM_INT_CNTL, 0);
5963         WREG32(SRBM_INT_CNTL, 0);
5964         for (i = 0; i < rdev->num_crtc; i++)
5965                 WREG32(INT_MASK + crtc_offsets[i], 0);
5966         for (i = 0; i < rdev->num_crtc; i++)
5967                 WREG32(GRPH_INT_CONTROL + crtc_offsets[i], 0);
5968 
5969         if (!ASIC_IS_NODCE(rdev)) {
5970                 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
5971 
5972                 for (i = 0; i < 6; i++)
5973                         WREG32_AND(DC_HPDx_INT_CONTROL(i),
5974                                    DC_HPDx_INT_POLARITY);
5975         }
5976 }
5977 
5978 static int si_irq_init(struct radeon_device *rdev)
5979 {
5980         int ret = 0;
5981         int rb_bufsz;
5982         u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
5983 
5984         /* allocate ring */
5985         ret = r600_ih_ring_alloc(rdev);
5986         if (ret)
5987                 return ret;
5988 
5989         /* disable irqs */
5990         si_disable_interrupts(rdev);
5991 
5992         /* init rlc */
5993         ret = si_rlc_resume(rdev);
5994         if (ret) {
5995                 r600_ih_ring_fini(rdev);
5996                 return ret;
5997         }
5998 
5999         /* setup interrupt control */
6000         /* set dummy read address to dummy page address */
6001         WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8);
6002         interrupt_cntl = RREG32(INTERRUPT_CNTL);
6003         /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
6004          * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
6005          */
6006         interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
6007         /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
6008         interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
6009         WREG32(INTERRUPT_CNTL, interrupt_cntl);
6010 
6011         WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
6012         rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
6013 
6014         ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
6015                       IH_WPTR_OVERFLOW_CLEAR |
6016                       (rb_bufsz << 1));
6017 
6018         if (rdev->wb.enabled)
6019                 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
6020 
6021         /* set the writeback address whether it's enabled or not */
6022         WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
6023         WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
6024 
6025         WREG32(IH_RB_CNTL, ih_rb_cntl);
6026 
6027         /* set rptr, wptr to 0 */
6028         WREG32(IH_RB_RPTR, 0);
6029         WREG32(IH_RB_WPTR, 0);
6030 
6031         /* Default settings for IH_CNTL (disabled at first) */
6032         ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
6033         /* RPTR_REARM only works if msi's are enabled */
6034         if (rdev->msi_enabled)
6035                 ih_cntl |= RPTR_REARM;
6036         WREG32(IH_CNTL, ih_cntl);
6037 
6038         /* force the active interrupt state to all disabled */
6039         si_disable_interrupt_state(rdev);
6040 
6041         pci_set_master(rdev->pdev);
6042 
6043         /* enable irqs */
6044         si_enable_interrupts(rdev);
6045 
6046         return ret;
6047 }
6048 
6049 /* The order we write back each register here is important */
6050 int si_irq_set(struct radeon_device *rdev)
6051 {
6052         int i;
6053         u32 cp_int_cntl;
6054         u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
6055         u32 grbm_int_cntl = 0;
6056         u32 dma_cntl, dma_cntl1;
6057         u32 thermal_int = 0;
6058 
6059         if (!rdev->irq.installed) {
6060                 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
6061                 return -EINVAL;
6062         }
6063         /* don't enable anything if the ih is disabled */
6064         if (!rdev->ih.enabled) {
6065                 si_disable_interrupts(rdev);
6066                 /* force the active interrupt state to all disabled */
6067                 si_disable_interrupt_state(rdev);
6068                 return 0;
6069         }
6070 
6071         cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
6072                 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6073 
6074         dma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
6075         dma_cntl1 = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
6076 
6077         thermal_int = RREG32(CG_THERMAL_INT) &
6078                 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
6079 
6080         /* enable CP interrupts on all rings */
6081         if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
6082                 DRM_DEBUG("si_irq_set: sw int gfx\n");
6083                 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
6084         }
6085         if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
6086                 DRM_DEBUG("si_irq_set: sw int cp1\n");
6087                 cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
6088         }
6089         if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
6090                 DRM_DEBUG("si_irq_set: sw int cp2\n");
6091                 cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
6092         }
6093         if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
6094                 DRM_DEBUG("si_irq_set: sw int dma\n");
6095                 dma_cntl |= TRAP_ENABLE;
6096         }
6097 
6098         if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
6099                 DRM_DEBUG("si_irq_set: sw int dma1\n");
6100                 dma_cntl1 |= TRAP_ENABLE;
6101         }
6102 
6103         WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
6104         WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
6105         WREG32(CP_INT_CNTL_RING2, cp_int_cntl2);
6106 
6107         WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, dma_cntl);
6108         WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, dma_cntl1);
6109 
6110         WREG32(GRBM_INT_CNTL, grbm_int_cntl);
6111 
6112         if (rdev->irq.dpm_thermal) {
6113                 DRM_DEBUG("dpm thermal\n");
6114                 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
6115         }
6116 
6117         for (i = 0; i < rdev->num_crtc; i++) {
6118                 radeon_irq_kms_set_irq_n_enabled(
6119                     rdev, INT_MASK + crtc_offsets[i], VBLANK_INT_MASK,
6120                     rdev->irq.crtc_vblank_int[i] ||
6121                     atomic_read(&rdev->irq.pflip[i]), "vblank", i);
6122         }
6123 
6124         for (i = 0; i < rdev->num_crtc; i++)
6125                 WREG32(GRPH_INT_CONTROL + crtc_offsets[i], GRPH_PFLIP_INT_MASK);
6126 
6127         if (!ASIC_IS_NODCE(rdev)) {
6128                 for (i = 0; i < 6; i++) {
6129                         radeon_irq_kms_set_irq_n_enabled(
6130                             rdev, DC_HPDx_INT_CONTROL(i),
6131                             DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN,
6132                             rdev->irq.hpd[i], "HPD", i);
6133                 }
6134         }
6135 
6136         WREG32(CG_THERMAL_INT, thermal_int);
6137 
6138         /* posting read */
6139         RREG32(SRBM_STATUS);
6140 
6141         return 0;
6142 }
6143 
6144 /* The order we write back each register here is important */
6145 static inline void si_irq_ack(struct radeon_device *rdev)
6146 {
6147         int i, j;
6148         u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
6149         u32 *grph_int = rdev->irq.stat_regs.evergreen.grph_int;
6150 
6151         if (ASIC_IS_NODCE(rdev))
6152                 return;
6153 
6154         for (i = 0; i < 6; i++) {
6155                 disp_int[i] = RREG32(si_disp_int_status[i]);
6156                 if (i < rdev->num_crtc)
6157                         grph_int[i] = RREG32(GRPH_INT_STATUS + crtc_offsets[i]);
6158         }
6159 
6160         /* We write back each interrupt register in pairs of two */
6161         for (i = 0; i < rdev->num_crtc; i += 2) {
6162                 for (j = i; j < (i + 2); j++) {
6163                         if (grph_int[j] & GRPH_PFLIP_INT_OCCURRED)
6164                                 WREG32(GRPH_INT_STATUS + crtc_offsets[j],
6165                                        GRPH_PFLIP_INT_CLEAR);
6166                 }
6167 
6168                 for (j = i; j < (i + 2); j++) {
6169                         if (disp_int[j] & LB_D1_VBLANK_INTERRUPT)
6170                                 WREG32(VBLANK_STATUS + crtc_offsets[j],
6171                                        VBLANK_ACK);
6172                         if (disp_int[j] & LB_D1_VLINE_INTERRUPT)
6173                                 WREG32(VLINE_STATUS + crtc_offsets[j],
6174                                        VLINE_ACK);
6175                 }
6176         }
6177 
6178         for (i = 0; i < 6; i++) {
6179                 if (disp_int[i] & DC_HPD1_INTERRUPT)
6180                         WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_ACK);
6181         }
6182 
6183         for (i = 0; i < 6; i++) {
6184                 if (disp_int[i] & DC_HPD1_RX_INTERRUPT)
6185                         WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_RX_INT_ACK);
6186         }
6187 }
6188 
6189 static void si_irq_disable(struct radeon_device *rdev)
6190 {
6191         si_disable_interrupts(rdev);
6192         /* Wait and acknowledge irq */
6193         mdelay(1);
6194         si_irq_ack(rdev);
6195         si_disable_interrupt_state(rdev);
6196 }
6197 
6198 static void si_irq_suspend(struct radeon_device *rdev)
6199 {
6200         si_irq_disable(rdev);
6201         si_rlc_stop(rdev);
6202 }
6203 
6204 static void si_irq_fini(struct radeon_device *rdev)
6205 {
6206         si_irq_suspend(rdev);
6207         r600_ih_ring_fini(rdev);
6208 }
6209 
6210 static inline u32 si_get_ih_wptr(struct radeon_device *rdev)
6211 {
6212         u32 wptr, tmp;
6213 
6214         if (rdev->wb.enabled)
6215                 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
6216         else
6217                 wptr = RREG32(IH_RB_WPTR);
6218 
6219         if (wptr & RB_OVERFLOW) {
6220                 wptr &= ~RB_OVERFLOW;
6221                 /* When a ring buffer overflow happen start parsing interrupt
6222                  * from the last not overwritten vector (wptr + 16). Hopefully
6223                  * this should allow us to catchup.
6224                  */
6225                 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
6226                          wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
6227                 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
6228                 tmp = RREG32(IH_RB_CNTL);
6229                 tmp |= IH_WPTR_OVERFLOW_CLEAR;
6230                 WREG32(IH_RB_CNTL, tmp);
6231         }
6232         return (wptr & rdev->ih.ptr_mask);
6233 }
6234 
6235 /*        SI IV Ring
6236  * Each IV ring entry is 128 bits:
6237  * [7:0]    - interrupt source id
6238  * [31:8]   - reserved
6239  * [59:32]  - interrupt source data
6240  * [63:60]  - reserved
6241  * [71:64]  - RINGID
6242  * [79:72]  - VMID
6243  * [127:80] - reserved
6244  */
6245 int si_irq_process(struct radeon_device *rdev)
6246 {
6247         u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
6248         u32 crtc_idx, hpd_idx;
6249         u32 mask;
6250         u32 wptr;
6251         u32 rptr;
6252         u32 src_id, src_data, ring_id;
6253         u32 ring_index;
6254         bool queue_hotplug = false;
6255         bool queue_dp = false;
6256         bool queue_thermal = false;
6257         u32 status, addr;
6258         const char *event_name;
6259 
6260         if (!rdev->ih.enabled || rdev->shutdown)
6261                 return IRQ_NONE;
6262 
6263         wptr = si_get_ih_wptr(rdev);
6264 
6265 restart_ih:
6266         /* is somebody else already processing irqs? */
6267         if (atomic_xchg(&rdev->ih.lock, 1))
6268                 return IRQ_NONE;
6269 
6270         rptr = rdev->ih.rptr;
6271         DRM_DEBUG("si_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
6272 
6273         /* Order reading of wptr vs. reading of IH ring data */
6274         rmb();
6275 
6276         /* display interrupts */
6277         si_irq_ack(rdev);
6278 
6279         while (rptr != wptr) {
6280                 /* wptr/rptr are in bytes! */
6281                 ring_index = rptr / 4;
6282                 src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
6283                 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
6284                 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
6285 
6286                 switch (src_id) {
6287                 case 1: /* D1 vblank/vline */
6288                 case 2: /* D2 vblank/vline */
6289                 case 3: /* D3 vblank/vline */
6290                 case 4: /* D4 vblank/vline */
6291                 case 5: /* D5 vblank/vline */
6292                 case 6: /* D6 vblank/vline */
6293                         crtc_idx = src_id - 1;
6294 
6295                         if (src_data == 0) { /* vblank */
6296                                 mask = LB_D1_VBLANK_INTERRUPT;
6297                                 event_name = "vblank";
6298 
6299                                 if (rdev->irq.crtc_vblank_int[crtc_idx]) {
6300                                         drm_handle_vblank(rdev->ddev, crtc_idx);
6301                                         rdev->pm.vblank_sync = true;
6302                                         wake_up(&rdev->irq.vblank_queue);
6303                                 }
6304                                 if (atomic_read(&rdev->irq.pflip[crtc_idx])) {
6305                                         radeon_crtc_handle_vblank(rdev,
6306                                                                   crtc_idx);
6307                                 }
6308 
6309                         } else if (src_data == 1) { /* vline */
6310                                 mask = LB_D1_VLINE_INTERRUPT;
6311                                 event_name = "vline";
6312                         } else {
6313                                 DRM_DEBUG("Unhandled interrupt: %d %d\n",
6314                                           src_id, src_data);
6315                                 break;
6316                         }
6317 
6318                         if (!(disp_int[crtc_idx] & mask)) {
6319                                 DRM_DEBUG("IH: D%d %s - IH event w/o asserted irq bit?\n",
6320                                           crtc_idx + 1, event_name);
6321                         }
6322 
6323                         disp_int[crtc_idx] &= ~mask;
6324                         DRM_DEBUG("IH: D%d %s\n", crtc_idx + 1, event_name);
6325 
6326                         break;
6327                 case 8: /* D1 page flip */
6328                 case 10: /* D2 page flip */
6329                 case 12: /* D3 page flip */
6330                 case 14: /* D4 page flip */
6331                 case 16: /* D5 page flip */
6332                 case 18: /* D6 page flip */
6333                         DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
6334                         if (radeon_use_pflipirq > 0)
6335                                 radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
6336                         break;
6337                 case 42: /* HPD hotplug */
6338                         if (src_data <= 5) {
6339                                 hpd_idx = src_data;
6340                                 mask = DC_HPD1_INTERRUPT;
6341                                 queue_hotplug = true;
6342                                 event_name = "HPD";
6343 
6344                         } else if (src_data <= 11) {
6345                                 hpd_idx = src_data - 6;
6346                                 mask = DC_HPD1_RX_INTERRUPT;
6347                                 queue_dp = true;
6348                                 event_name = "HPD_RX";
6349 
6350                         } else {
6351                                 DRM_DEBUG("Unhandled interrupt: %d %d\n",
6352                                           src_id, src_data);
6353                                 break;
6354                         }
6355 
6356                         if (!(disp_int[hpd_idx] & mask))
6357                                 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6358 
6359                         disp_int[hpd_idx] &= ~mask;
6360                         DRM_DEBUG("IH: %s%d\n", event_name, hpd_idx + 1);
6361                         break;
6362                 case 96:
6363                         DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
6364                         WREG32(SRBM_INT_ACK, 0x1);
6365                         break;
6366                 case 124: /* UVD */
6367                         DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
6368                         radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
6369                         break;
6370                 case 146:
6371                 case 147:
6372                         addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
6373                         status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
6374                         /* reset addr and status */
6375                         WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
6376                         if (addr == 0x0 && status == 0x0)
6377                                 break;
6378                         dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
6379                         dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
6380                                 addr);
6381                         dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
6382                                 status);
6383                         si_vm_decode_fault(rdev, status, addr);
6384                         break;
6385                 case 176: /* RINGID0 CP_INT */
6386                         radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6387                         break;
6388                 case 177: /* RINGID1 CP_INT */
6389                         radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6390                         break;
6391                 case 178: /* RINGID2 CP_INT */
6392                         radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6393                         break;
6394                 case 181: /* CP EOP event */
6395                         DRM_DEBUG("IH: CP EOP\n");
6396                         switch (ring_id) {
6397                         case 0:
6398                                 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6399                                 break;
6400                         case 1:
6401                                 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6402                                 break;
6403                         case 2:
6404                                 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6405                                 break;
6406                         }
6407                         break;
6408                 case 224: /* DMA trap event */
6409                         DRM_DEBUG("IH: DMA trap\n");
6410                         radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
6411                         break;
6412                 case 230: /* thermal low to high */
6413                         DRM_DEBUG("IH: thermal low to high\n");
6414                         rdev->pm.dpm.thermal.high_to_low = false;
6415                         queue_thermal = true;
6416                         break;
6417                 case 231: /* thermal high to low */
6418                         DRM_DEBUG("IH: thermal high to low\n");
6419                         rdev->pm.dpm.thermal.high_to_low = true;
6420                         queue_thermal = true;
6421                         break;
6422                 case 233: /* GUI IDLE */
6423                         DRM_DEBUG("IH: GUI idle\n");
6424                         break;
6425                 case 244: /* DMA trap event */
6426                         DRM_DEBUG("IH: DMA1 trap\n");
6427                         radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
6428                         break;
6429                 default:
6430                         DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6431                         break;
6432                 }
6433 
6434                 /* wptr/rptr are in bytes! */
6435                 rptr += 16;
6436                 rptr &= rdev->ih.ptr_mask;
6437                 WREG32(IH_RB_RPTR, rptr);
6438         }
6439         if (queue_dp)
6440                 schedule_work(&rdev->dp_work);
6441         if (queue_hotplug)
6442                 schedule_delayed_work(&rdev->hotplug_work, 0);
6443         if (queue_thermal && rdev->pm.dpm_enabled)
6444                 schedule_work(&rdev->pm.dpm.thermal.work);
6445         rdev->ih.rptr = rptr;
6446         atomic_set(&rdev->ih.lock, 0);
6447 
6448         /* make sure wptr hasn't changed while processing */
6449         wptr = si_get_ih_wptr(rdev);
6450         if (wptr != rptr)
6451                 goto restart_ih;
6452 
6453         return IRQ_HANDLED;
6454 }
6455 
6456 /*
6457  * startup/shutdown callbacks
6458  */
6459 static void si_uvd_init(struct radeon_device *rdev)
6460 {
6461         int r;
6462 
6463         if (!rdev->has_uvd)
6464                 return;
6465 
6466         r = radeon_uvd_init(rdev);
6467         if (r) {
6468                 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
6469                 /*
6470                  * At this point rdev->uvd.vcpu_bo is NULL which trickles down
6471                  * to early fails uvd_v2_2_resume() and thus nothing happens
6472                  * there. So it is pointless to try to go through that code
6473                  * hence why we disable uvd here.
6474                  */
6475                 rdev->has_uvd = 0;
6476                 return;
6477         }
6478         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
6479         r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
6480 }
6481 
6482 static void si_uvd_start(struct radeon_device *rdev)
6483 {
6484         int r;
6485 
6486         if (!rdev->has_uvd)
6487                 return;
6488 
6489         r = uvd_v2_2_resume(rdev);
6490         if (r) {
6491                 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
6492                 goto error;
6493         }
6494         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
6495         if (r) {
6496                 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
6497                 goto error;
6498         }
6499         return;
6500 
6501 error:
6502         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
6503 }
6504 
6505 static void si_uvd_resume(struct radeon_device *rdev)
6506 {
6507         struct radeon_ring *ring;
6508         int r;
6509 
6510         if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
6511                 return;
6512 
6513         ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
6514         r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
6515         if (r) {
6516                 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
6517                 return;
6518         }
6519         r = uvd_v1_0_init(rdev);
6520         if (r) {
6521                 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
6522                 return;
6523         }
6524 }
6525 
6526 static void si_vce_init(struct radeon_device *rdev)
6527 {
6528         int r;
6529 
6530         if (!rdev->has_vce)
6531                 return;
6532 
6533         r = radeon_vce_init(rdev);
6534         if (r) {
6535                 dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
6536                 /*
6537                  * At this point rdev->vce.vcpu_bo is NULL which trickles down
6538                  * to early fails si_vce_start() and thus nothing happens
6539                  * there. So it is pointless to try to go through that code
6540                  * hence why we disable vce here.
6541                  */
6542                 rdev->has_vce = 0;
6543                 return;
6544         }
6545         rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
6546         r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
6547         rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
6548         r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
6549 }
6550 
6551 static void si_vce_start(struct radeon_device *rdev)
6552 {
6553         int r;
6554 
6555         if (!rdev->has_vce)
6556                 return;
6557 
6558         r = radeon_vce_resume(rdev);
6559         if (r) {
6560                 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
6561                 goto error;
6562         }
6563         r = vce_v1_0_resume(rdev);
6564         if (r) {
6565                 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
6566                 goto error;
6567         }
6568         r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
6569         if (r) {
6570                 dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
6571                 goto error;
6572         }
6573         r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
6574         if (r) {
6575                 dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
6576                 goto error;
6577         }
6578         return;
6579 
6580 error:
6581         rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
6582         rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
6583 }
6584 
6585 static void si_vce_resume(struct radeon_device *rdev)
6586 {
6587         struct radeon_ring *ring;
6588         int r;
6589 
6590         if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
6591                 return;
6592 
6593         ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
6594         r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
6595         if (r) {
6596                 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
6597                 return;
6598         }
6599         ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
6600         r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
6601         if (r) {
6602                 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
6603                 return;
6604         }
6605         r = vce_v1_0_init(rdev);
6606         if (r) {
6607                 dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
6608                 return;
6609         }
6610 }
6611 
6612 static int si_startup(struct radeon_device *rdev)
6613 {
6614         struct radeon_ring *ring;
6615         int r;
6616 
6617         /* enable pcie gen2/3 link */
6618         si_pcie_gen3_enable(rdev);
6619         /* enable aspm */
6620         si_program_aspm(rdev);
6621 
6622         /* scratch needs to be initialized before MC */
6623         r = r600_vram_scratch_init(rdev);
6624         if (r)
6625                 return r;
6626 
6627         si_mc_program(rdev);
6628 
6629         if (!rdev->pm.dpm_enabled) {
6630                 r = si_mc_load_microcode(rdev);
6631                 if (r) {
6632                         DRM_ERROR("Failed to load MC firmware!\n");
6633                         return r;
6634                 }
6635         }
6636 
6637         r = si_pcie_gart_enable(rdev);
6638         if (r)
6639                 return r;
6640         si_gpu_init(rdev);
6641 
6642         /* allocate rlc buffers */
6643         if (rdev->family == CHIP_VERDE) {
6644                 rdev->rlc.reg_list = verde_rlc_save_restore_register_list;
6645                 rdev->rlc.reg_list_size =
6646                         (u32)ARRAY_SIZE(verde_rlc_save_restore_register_list);
6647         }
6648         rdev->rlc.cs_data = si_cs_data;
6649         r = sumo_rlc_init(rdev);
6650         if (r) {
6651                 DRM_ERROR("Failed to init rlc BOs!\n");
6652                 return r;
6653         }
6654 
6655         /* allocate wb buffer */
6656         r = radeon_wb_init(rdev);
6657         if (r)
6658                 return r;
6659 
6660         r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
6661         if (r) {
6662                 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6663                 return r;
6664         }
6665 
6666         r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6667         if (r) {
6668                 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6669                 return r;
6670         }
6671 
6672         r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6673         if (r) {
6674                 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6675                 return r;
6676         }
6677 
6678         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
6679         if (r) {
6680                 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
6681                 return r;
6682         }
6683 
6684         r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
6685         if (r) {
6686                 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
6687                 return r;
6688         }
6689 
6690         si_uvd_start(rdev);
6691         si_vce_start(rdev);
6692 
6693         /* Enable IRQ */
6694         if (!rdev->irq.installed) {
6695                 r = radeon_irq_kms_init(rdev);
6696                 if (r)
6697                         return r;
6698         }
6699 
6700         r = si_irq_init(rdev);
6701         if (r) {
6702                 DRM_ERROR("radeon: IH init failed (%d).\n", r);
6703                 radeon_irq_kms_fini(rdev);
6704                 return r;
6705         }
6706         si_irq_set(rdev);
6707 
6708         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6709         r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
6710                              RADEON_CP_PACKET2);
6711         if (r)
6712                 return r;
6713 
6714         ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6715         r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
6716                              RADEON_CP_PACKET2);
6717         if (r)
6718                 return r;
6719 
6720         ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6721         r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
6722                              RADEON_CP_PACKET2);
6723         if (r)
6724                 return r;
6725 
6726         ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
6727         r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
6728                              DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6729         if (r)
6730                 return r;
6731 
6732         ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
6733         r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
6734                              DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6735         if (r)
6736                 return r;
6737 
6738         r = si_cp_load_microcode(rdev);
6739         if (r)
6740                 return r;
6741         r = si_cp_resume(rdev);
6742         if (r)
6743                 return r;
6744 
6745         r = cayman_dma_resume(rdev);
6746         if (r)
6747                 return r;
6748 
6749         si_uvd_resume(rdev);
6750         si_vce_resume(rdev);
6751 
6752         r = radeon_ib_pool_init(rdev);
6753         if (r) {
6754                 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
6755                 return r;
6756         }
6757 
6758         r = radeon_vm_manager_init(rdev);
6759         if (r) {
6760                 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
6761                 return r;
6762         }
6763 
6764         r = radeon_audio_init(rdev);
6765         if (r)
6766                 return r;
6767 
6768         return 0;
6769 }
6770 
6771 int si_resume(struct radeon_device *rdev)
6772 {
6773         int r;
6774 
6775         /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
6776          * posting will perform necessary task to bring back GPU into good
6777          * shape.
6778          */
6779         /* post card */
6780         atom_asic_init(rdev->mode_info.atom_context);
6781 
6782         /* init golden registers */
6783         si_init_golden_registers(rdev);
6784 
6785         if (rdev->pm.pm_method == PM_METHOD_DPM)
6786                 radeon_pm_resume(rdev);
6787 
6788         rdev->accel_working = true;
6789         r = si_startup(rdev);
6790         if (r) {
6791                 DRM_ERROR("si startup failed on resume\n");
6792                 rdev->accel_working = false;
6793                 return r;
6794         }
6795 
6796         return r;
6797 
6798 }
6799 
6800 int si_suspend(struct radeon_device *rdev)
6801 {
6802         radeon_pm_suspend(rdev);
6803         radeon_audio_fini(rdev);
6804         radeon_vm_manager_fini(rdev);
6805         si_cp_enable(rdev, false);
6806         cayman_dma_stop(rdev);
6807         if (rdev->has_uvd) {
6808                 uvd_v1_0_fini(rdev);
6809                 radeon_uvd_suspend(rdev);
6810         }
6811         if (rdev->has_vce)
6812                 radeon_vce_suspend(rdev);
6813         si_fini_pg(rdev);
6814         si_fini_cg(rdev);
6815         si_irq_suspend(rdev);
6816         radeon_wb_disable(rdev);
6817         si_pcie_gart_disable(rdev);
6818         return 0;
6819 }
6820 
6821 /* Plan is to move initialization in that function and use
6822  * helper function so that radeon_device_init pretty much
6823  * do nothing more than calling asic specific function. This
6824  * should also allow to remove a bunch of callback function
6825  * like vram_info.
6826  */
6827 int si_init(struct radeon_device *rdev)
6828 {
6829         struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6830         int r;
6831 
6832         /* Read BIOS */
6833         if (!radeon_get_bios(rdev)) {
6834                 if (ASIC_IS_AVIVO(rdev))
6835                         return -EINVAL;
6836         }
6837         /* Must be an ATOMBIOS */
6838         if (!rdev->is_atom_bios) {
6839                 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
6840                 return -EINVAL;
6841         }
6842         r = radeon_atombios_init(rdev);
6843         if (r)
6844                 return r;
6845 
6846         /* Post card if necessary */
6847         if (!radeon_card_posted(rdev)) {
6848                 if (!rdev->bios) {
6849                         dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
6850                         return -EINVAL;
6851                 }
6852                 DRM_INFO("GPU not posted. posting now...\n");
6853                 atom_asic_init(rdev->mode_info.atom_context);
6854         }
6855         /* init golden registers */
6856         si_init_golden_registers(rdev);
6857         /* Initialize scratch registers */
6858         si_scratch_init(rdev);
6859         /* Initialize surface registers */
6860         radeon_surface_init(rdev);
6861         /* Initialize clocks */
6862         radeon_get_clock_info(rdev->ddev);
6863 
6864         /* Fence driver */
6865         r = radeon_fence_driver_init(rdev);
6866         if (r)
6867                 return r;
6868 
6869         /* initialize memory controller */
6870         r = si_mc_init(rdev);
6871         if (r)
6872                 return r;
6873         /* Memory manager */
6874         r = radeon_bo_init(rdev);
6875         if (r)
6876                 return r;
6877 
6878         if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
6879             !rdev->rlc_fw || !rdev->mc_fw) {
6880                 r = si_init_microcode(rdev);
6881                 if (r) {
6882                         DRM_ERROR("Failed to load firmware!\n");
6883                         return r;
6884                 }
6885         }
6886 
6887         /* Initialize power management */
6888         radeon_pm_init(rdev);
6889 
6890         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6891         ring->ring_obj = NULL;
6892         r600_ring_init(rdev, ring, 1024 * 1024);
6893 
6894         ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6895         ring->ring_obj = NULL;
6896         r600_ring_init(rdev, ring, 1024 * 1024);
6897 
6898         ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6899         ring->ring_obj = NULL;
6900         r600_ring_init(rdev, ring, 1024 * 1024);
6901 
6902         ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
6903         ring->ring_obj = NULL;
6904         r600_ring_init(rdev, ring, 64 * 1024);
6905 
6906         ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
6907         ring->ring_obj = NULL;
6908         r600_ring_init(rdev, ring, 64 * 1024);
6909 
6910         si_uvd_init(rdev);
6911         si_vce_init(rdev);
6912 
6913         rdev->ih.ring_obj = NULL;
6914         r600_ih_ring_init(rdev, 64 * 1024);
6915 
6916         r = r600_pcie_gart_init(rdev);
6917         if (r)
6918                 return r;
6919 
6920         rdev->accel_working = true;
6921         r = si_startup(rdev);
6922         if (r) {
6923                 dev_err(rdev->dev, "disabling GPU acceleration\n");
6924                 si_cp_fini(rdev);
6925                 cayman_dma_fini(rdev);
6926                 si_irq_fini(rdev);
6927                 sumo_rlc_fini(rdev);
6928                 radeon_wb_fini(rdev);
6929                 radeon_ib_pool_fini(rdev);
6930                 radeon_vm_manager_fini(rdev);
6931                 radeon_irq_kms_fini(rdev);
6932                 si_pcie_gart_fini(rdev);
6933                 rdev->accel_working = false;
6934         }
6935 
6936         /* Don't start up if the MC ucode is missing.
6937          * The default clocks and voltages before the MC ucode
6938          * is loaded are not suffient for advanced operations.
6939          */
6940         if (!rdev->mc_fw) {
6941                 DRM_ERROR("radeon: MC ucode required for NI+.\n");
6942                 return -EINVAL;
6943         }
6944 
6945         return 0;
6946 }
6947 
6948 void si_fini(struct radeon_device *rdev)
6949 {
6950         radeon_pm_fini(rdev);
6951         si_cp_fini(rdev);
6952         cayman_dma_fini(rdev);
6953         si_fini_pg(rdev);
6954         si_fini_cg(rdev);
6955         si_irq_fini(rdev);
6956         sumo_rlc_fini(rdev);
6957         radeon_wb_fini(rdev);
6958         radeon_vm_manager_fini(rdev);
6959         radeon_ib_pool_fini(rdev);
6960         radeon_irq_kms_fini(rdev);
6961         if (rdev->has_uvd) {
6962                 uvd_v1_0_fini(rdev);
6963                 radeon_uvd_fini(rdev);
6964         }
6965         if (rdev->has_vce)
6966                 radeon_vce_fini(rdev);
6967         si_pcie_gart_fini(rdev);
6968         r600_vram_scratch_fini(rdev);
6969         radeon_gem_fini(rdev);
6970         radeon_fence_driver_fini(rdev);
6971         radeon_bo_fini(rdev);
6972         radeon_atombios_fini(rdev);
6973         kfree(rdev->bios);
6974         rdev->bios = NULL;
6975 }
6976 
6977 /**
6978  * si_get_gpu_clock_counter - return GPU clock counter snapshot
6979  *
6980  * @rdev: radeon_device pointer
6981  *
6982  * Fetches a GPU clock counter snapshot (SI).
6983  * Returns the 64 bit clock counter snapshot.
6984  */
6985 uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev)
6986 {
6987         uint64_t clock;
6988 
6989         mutex_lock(&rdev->gpu_clock_mutex);
6990         WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
6991         clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
6992                 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
6993         mutex_unlock(&rdev->gpu_clock_mutex);
6994         return clock;
6995 }
6996 
6997 int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
6998 {
6999         unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
7000         int r;
7001 
7002         /* bypass vclk and dclk with bclk */
7003         WREG32_P(CG_UPLL_FUNC_CNTL_2,
7004                 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
7005                 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
7006 
7007         /* put PLL in bypass mode */
7008         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
7009 
7010         if (!vclk || !dclk) {
7011                 /* keep the Bypass mode */
7012                 return 0;
7013         }
7014 
7015         r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
7016                                           16384, 0x03FFFFFF, 0, 128, 5,
7017                                           &fb_div, &vclk_div, &dclk_div);
7018         if (r)
7019                 return r;
7020 
7021         /* set RESET_ANTI_MUX to 0 */
7022         WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
7023 
7024         /* set VCO_MODE to 1 */
7025         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
7026 
7027         /* disable sleep mode */
7028         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
7029 
7030         /* deassert UPLL_RESET */
7031         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
7032 
7033         mdelay(1);
7034 
7035         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
7036         if (r)
7037                 return r;
7038 
7039         /* assert UPLL_RESET again */
7040         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
7041 
7042         /* disable spread spectrum. */
7043         WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
7044 
7045         /* set feedback divider */
7046         WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
7047 
7048         /* set ref divider to 0 */
7049         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
7050 
7051         if (fb_div < 307200)
7052                 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
7053         else
7054                 WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
7055 
7056         /* set PDIV_A and PDIV_B */
7057         WREG32_P(CG_UPLL_FUNC_CNTL_2,
7058                 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
7059                 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
7060 
7061         /* give the PLL some time to settle */
7062         mdelay(15);
7063 
7064         /* deassert PLL_RESET */
7065         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
7066 
7067         mdelay(15);
7068 
7069         /* switch from bypass mode to normal mode */
7070         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
7071 
7072         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
7073         if (r)
7074                 return r;
7075 
7076         /* switch VCLK and DCLK selection */
7077         WREG32_P(CG_UPLL_FUNC_CNTL_2,
7078                 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
7079                 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
7080 
7081         mdelay(100);
7082 
7083         return 0;
7084 }
7085 
7086 static void si_pcie_gen3_enable(struct radeon_device *rdev)
7087 {
7088         struct pci_dev *root = rdev->pdev->bus->self;
7089         enum pci_bus_speed speed_cap;
7090         int bridge_pos, gpu_pos;
7091         u32 speed_cntl, current_data_rate;
7092         int i;
7093         u16 tmp16;
7094 
7095         if (pci_is_root_bus(rdev->pdev->bus))
7096                 return;
7097 
7098         if (radeon_pcie_gen2 == 0)
7099                 return;
7100 
7101         if (rdev->flags & RADEON_IS_IGP)
7102                 return;
7103 
7104         if (!(rdev->flags & RADEON_IS_PCIE))
7105                 return;
7106 
7107         speed_cap = pcie_get_speed_cap(root);
7108         if (speed_cap == PCI_SPEED_UNKNOWN)
7109                 return;
7110 
7111         if ((speed_cap != PCIE_SPEED_8_0GT) &&
7112             (speed_cap != PCIE_SPEED_5_0GT))
7113                 return;
7114 
7115         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
7116         current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
7117                 LC_CURRENT_DATA_RATE_SHIFT;
7118         if (speed_cap == PCIE_SPEED_8_0GT) {
7119                 if (current_data_rate == 2) {
7120                         DRM_INFO("PCIE gen 3 link speeds already enabled\n");
7121                         return;
7122                 }
7123                 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
7124         } else if (speed_cap == PCIE_SPEED_5_0GT) {
7125                 if (current_data_rate == 1) {
7126                         DRM_INFO("PCIE gen 2 link speeds already enabled\n");
7127                         return;
7128                 }
7129                 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
7130         }
7131 
7132         bridge_pos = pci_pcie_cap(root);
7133         if (!bridge_pos)
7134                 return;
7135 
7136         gpu_pos = pci_pcie_cap(rdev->pdev);
7137         if (!gpu_pos)
7138                 return;
7139 
7140         if (speed_cap == PCIE_SPEED_8_0GT) {
7141                 /* re-try equalization if gen3 is not already enabled */
7142                 if (current_data_rate != 2) {
7143                         u16 bridge_cfg, gpu_cfg;
7144                         u16 bridge_cfg2, gpu_cfg2;
7145                         u32 max_lw, current_lw, tmp;
7146 
7147                         pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
7148                         pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
7149 
7150                         tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
7151                         pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
7152 
7153                         tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
7154                         pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
7155 
7156                         tmp = RREG32_PCIE(PCIE_LC_STATUS1);
7157                         max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
7158                         current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
7159 
7160                         if (current_lw < max_lw) {
7161                                 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
7162                                 if (tmp & LC_RENEGOTIATION_SUPPORT) {
7163                                         tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
7164                                         tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
7165                                         tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
7166                                         WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
7167                                 }
7168                         }
7169 
7170                         for (i = 0; i < 10; i++) {
7171                                 /* check status */
7172                                 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
7173                                 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
7174                                         break;
7175 
7176                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
7177                                 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
7178 
7179                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
7180                                 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
7181 
7182                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
7183                                 tmp |= LC_SET_QUIESCE;
7184                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
7185 
7186                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
7187                                 tmp |= LC_REDO_EQ;
7188                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
7189 
7190                                 msleep(100);
7191 
7192                                 /* linkctl */
7193                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
7194                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
7195                                 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
7196                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
7197 
7198                                 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
7199                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
7200                                 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
7201                                 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
7202 
7203                                 /* linkctl2 */
7204                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
7205                                 tmp16 &= ~((1 << 4) | (7 << 9));
7206                                 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
7207                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
7208 
7209                                 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
7210                                 tmp16 &= ~((1 << 4) | (7 << 9));
7211                                 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
7212                                 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
7213 
7214                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
7215                                 tmp &= ~LC_SET_QUIESCE;
7216                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
7217                         }
7218                 }
7219         }
7220 
7221         /* set the link speed */
7222         speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
7223         speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
7224         WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
7225 
7226         pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
7227         tmp16 &= ~0xf;
7228         if (speed_cap == PCIE_SPEED_8_0GT)
7229                 tmp16 |= 3; /* gen3 */
7230         else if (speed_cap == PCIE_SPEED_5_0GT)
7231                 tmp16 |= 2; /* gen2 */
7232         else
7233                 tmp16 |= 1; /* gen1 */
7234         pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
7235 
7236         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
7237         speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
7238         WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
7239 
7240         for (i = 0; i < rdev->usec_timeout; i++) {
7241                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
7242                 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
7243                         break;
7244                 udelay(1);
7245         }
7246 }
7247 
7248 static void si_program_aspm(struct radeon_device *rdev)
7249 {
7250         u32 data, orig;
7251         bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
7252         bool disable_clkreq = false;
7253 
7254         if (radeon_aspm == 0)
7255                 return;
7256 
7257         if (!(rdev->flags & RADEON_IS_PCIE))
7258                 return;
7259 
7260         orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
7261         data &= ~LC_XMIT_N_FTS_MASK;
7262         data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
7263         if (orig != data)
7264                 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
7265 
7266         orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
7267         data |= LC_GO_TO_RECOVERY;
7268         if (orig != data)
7269                 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
7270 
7271         orig = data = RREG32_PCIE(PCIE_P_CNTL);
7272         data |= P_IGNORE_EDB_ERR;
7273         if (orig != data)
7274                 WREG32_PCIE(PCIE_P_CNTL, data);
7275 
7276         orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
7277         data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
7278         data |= LC_PMI_TO_L1_DIS;
7279         if (!disable_l0s)
7280                 data |= LC_L0S_INACTIVITY(7);
7281 
7282         if (!disable_l1) {
7283                 data |= LC_L1_INACTIVITY(7);
7284                 data &= ~LC_PMI_TO_L1_DIS;
7285                 if (orig != data)
7286                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7287 
7288                 if (!disable_plloff_in_l1) {
7289                         bool clk_req_support;
7290 
7291                         orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
7292                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
7293                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
7294                         if (orig != data)
7295                                 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
7296 
7297                         orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
7298                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
7299                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
7300                         if (orig != data)
7301                                 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
7302 
7303                         orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
7304                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
7305                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
7306                         if (orig != data)
7307                                 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
7308 
7309                         orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
7310                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
7311                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
7312                         if (orig != data)
7313                                 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
7314 
7315                         if ((rdev->family != CHIP_OLAND) && (rdev->family != CHIP_HAINAN)) {
7316                                 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
7317                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
7318                                 if (orig != data)
7319                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
7320 
7321                                 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
7322                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
7323                                 if (orig != data)
7324                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
7325 
7326                                 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_2);
7327                                 data &= ~PLL_RAMP_UP_TIME_2_MASK;
7328                                 if (orig != data)
7329                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_2, data);
7330 
7331                                 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_3);
7332                                 data &= ~PLL_RAMP_UP_TIME_3_MASK;
7333                                 if (orig != data)
7334                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_3, data);
7335 
7336                                 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
7337                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
7338                                 if (orig != data)
7339                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
7340 
7341                                 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
7342                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
7343                                 if (orig != data)
7344                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
7345 
7346                                 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_2);
7347                                 data &= ~PLL_RAMP_UP_TIME_2_MASK;
7348                                 if (orig != data)
7349                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_2, data);
7350 
7351                                 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_3);
7352                                 data &= ~PLL_RAMP_UP_TIME_3_MASK;
7353                                 if (orig != data)
7354                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_3, data);
7355                         }
7356                         orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
7357                         data &= ~LC_DYN_LANES_PWR_STATE_MASK;
7358                         data |= LC_DYN_LANES_PWR_STATE(3);
7359                         if (orig != data)
7360                                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
7361 
7362                         orig = data = RREG32_PIF_PHY0(PB0_PIF_CNTL);
7363                         data &= ~LS2_EXIT_TIME_MASK;
7364                         if ((rdev->family == CHIP_OLAND) || (rdev->family == CHIP_HAINAN))
7365                                 data |= LS2_EXIT_TIME(5);
7366                         if (orig != data)
7367                                 WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
7368 
7369                         orig = data = RREG32_PIF_PHY1(PB1_PIF_CNTL);
7370                         data &= ~LS2_EXIT_TIME_MASK;
7371                         if ((rdev->family == CHIP_OLAND) || (rdev->family == CHIP_HAINAN))
7372                                 data |= LS2_EXIT_TIME(5);
7373                         if (orig != data)
7374                                 WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
7375 
7376                         if (!disable_clkreq &&
7377                             !pci_is_root_bus(rdev->pdev->bus)) {
7378                                 struct pci_dev *root = rdev->pdev->bus->self;
7379                                 u32 lnkcap;
7380 
7381                                 clk_req_support = false;
7382                                 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
7383                                 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
7384                                         clk_req_support = true;
7385                         } else {
7386                                 clk_req_support = false;
7387                         }
7388 
7389                         if (clk_req_support) {
7390                                 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
7391                                 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
7392                                 if (orig != data)
7393                                         WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
7394 
7395                                 orig = data = RREG32(THM_CLK_CNTL);
7396                                 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
7397                                 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
7398                                 if (orig != data)
7399                                         WREG32(THM_CLK_CNTL, data);
7400 
7401                                 orig = data = RREG32(MISC_CLK_CNTL);
7402                                 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
7403                                 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
7404                                 if (orig != data)
7405                                         WREG32(MISC_CLK_CNTL, data);
7406 
7407                                 orig = data = RREG32(CG_CLKPIN_CNTL);
7408                                 data &= ~BCLK_AS_XCLK;
7409                                 if (orig != data)
7410                                         WREG32(CG_CLKPIN_CNTL, data);
7411 
7412                                 orig = data = RREG32(CG_CLKPIN_CNTL_2);
7413                                 data &= ~FORCE_BIF_REFCLK_EN;
7414                                 if (orig != data)
7415                                         WREG32(CG_CLKPIN_CNTL_2, data);
7416 
7417                                 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
7418                                 data &= ~MPLL_CLKOUT_SEL_MASK;
7419                                 data |= MPLL_CLKOUT_SEL(4);
7420                                 if (orig != data)
7421                                         WREG32(MPLL_BYPASSCLK_SEL, data);
7422 
7423                                 orig = data = RREG32(SPLL_CNTL_MODE);
7424                                 data &= ~SPLL_REFCLK_SEL_MASK;
7425                                 if (orig != data)
7426                                         WREG32(SPLL_CNTL_MODE, data);
7427                         }
7428                 }
7429         } else {
7430                 if (orig != data)
7431                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7432         }
7433 
7434         orig = data = RREG32_PCIE(PCIE_CNTL2);
7435         data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
7436         if (orig != data)
7437                 WREG32_PCIE(PCIE_CNTL2, data);
7438 
7439         if (!disable_l0s) {
7440                 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
7441                 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
7442                         data = RREG32_PCIE(PCIE_LC_STATUS1);
7443                         if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
7444                                 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
7445                                 data &= ~LC_L0S_INACTIVITY_MASK;
7446                                 if (orig != data)
7447                                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7448                         }
7449                 }
7450         }
7451 }
7452 
7453 static int si_vce_send_vcepll_ctlreq(struct radeon_device *rdev)
7454 {
7455         unsigned i;
7456 
7457         /* make sure VCEPLL_CTLREQ is deasserted */
7458         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
7459 
7460         mdelay(10);
7461 
7462         /* assert UPLL_CTLREQ */
7463         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
7464 
7465         /* wait for CTLACK and CTLACK2 to get asserted */
7466         for (i = 0; i < 100; ++i) {
7467                 uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
7468                 if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
7469                         break;
7470                 mdelay(10);
7471         }
7472 
7473         /* deassert UPLL_CTLREQ */
7474         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
7475 
7476         if (i == 100) {
7477                 DRM_ERROR("Timeout setting UVD clocks!\n");
7478                 return -ETIMEDOUT;
7479         }
7480 
7481         return 0;
7482 }
7483 
7484 int si_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
7485 {
7486         unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
7487         int r;
7488 
7489         /* bypass evclk and ecclk with bclk */
7490         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
7491                      EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
7492                      ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
7493 
7494         /* put PLL in bypass mode */
7495         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
7496                      ~VCEPLL_BYPASS_EN_MASK);
7497 
7498         if (!evclk || !ecclk) {
7499                 /* keep the Bypass mode, put PLL to sleep */
7500                 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
7501                              ~VCEPLL_SLEEP_MASK);
7502                 return 0;
7503         }
7504 
7505         r = radeon_uvd_calc_upll_dividers(rdev, evclk, ecclk, 125000, 250000,
7506                                           16384, 0x03FFFFFF, 0, 128, 5,
7507                                           &fb_div, &evclk_div, &ecclk_div);
7508         if (r)
7509                 return r;
7510 
7511         /* set RESET_ANTI_MUX to 0 */
7512         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
7513 
7514         /* set VCO_MODE to 1 */
7515         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
7516                      ~VCEPLL_VCO_MODE_MASK);
7517 
7518         /* toggle VCEPLL_SLEEP to 1 then back to 0 */
7519         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
7520                      ~VCEPLL_SLEEP_MASK);
7521         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
7522 
7523         /* deassert VCEPLL_RESET */
7524         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
7525 
7526         mdelay(1);
7527 
7528         r = si_vce_send_vcepll_ctlreq(rdev);
7529         if (r)
7530                 return r;
7531 
7532         /* assert VCEPLL_RESET again */
7533         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
7534 
7535         /* disable spread spectrum. */
7536         WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
7537 
7538         /* set feedback divider */
7539         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3, VCEPLL_FB_DIV(fb_div), ~VCEPLL_FB_DIV_MASK);
7540 
7541         /* set ref divider to 0 */
7542         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
7543 
7544         /* set PDIV_A and PDIV_B */
7545         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
7546                      VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
7547                      ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
7548 
7549         /* give the PLL some time to settle */
7550         mdelay(15);
7551 
7552         /* deassert PLL_RESET */
7553         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
7554 
7555         mdelay(15);
7556 
7557         /* switch from bypass mode to normal mode */
7558         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
7559 
7560         r = si_vce_send_vcepll_ctlreq(rdev);
7561         if (r)
7562                 return r;
7563 
7564         /* switch VCLK and DCLK selection */
7565         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
7566                      EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
7567                      ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
7568 
7569         mdelay(100);
7570 
7571         return 0;
7572 }

/* [<][>][^][v][top][bottom][index][help] */