1 /* 2 * Copyright 2015 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 */ 23 24 #include <linux/firmware.h> 25 #include <linux/slab.h> 26 #include <linux/module.h> 27 #include <drm/drmP.h> 28 #include "amdgpu.h" 29 #include "amdgpu_atombios.h" 30 #include "amdgpu_ih.h" 31 #include "amdgpu_uvd.h" 32 #include "amdgpu_vce.h" 33 #include "atom.h" 34 #include "amd_pcie.h" 35 #include "si_dpm.h" 36 #include "sid.h" 37 #include "si_ih.h" 38 #include "gfx_v6_0.h" 39 #include "gmc_v6_0.h" 40 #include "si_dma.h" 41 #include "dce_v6_0.h" 42 #include "si.h" 43 #include "dce_virtual.h" 44 #include "gca/gfx_6_0_d.h" 45 #include "oss/oss_1_0_d.h" 46 #include "gmc/gmc_6_0_d.h" 47 #include "dce/dce_6_0_d.h" 48 #include "uvd/uvd_4_0_d.h" 49 #include "bif/bif_3_0_d.h" 50 #include "bif/bif_3_0_sh_mask.h" 51 52 static const u32 tahiti_golden_registers[] = 53 { 54 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011, 55 mmCB_HW_CONTROL, 0x00010000, 0x00018208, 56 mmDB_DEBUG, 0xffffffff, 0x00000000, 57 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 58 mmDB_DEBUG3, 0x0002021c, 0x00020200, 59 mmDCI_CLK_CNTL, 0x00000080, 0x00000000, 60 0x340c, 0x000000c0, 0x00800040, 61 0x360c, 0x000000c0, 0x00800040, 62 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070, 63 mmFBC_MISC, 0x00200000, 0x50100000, 64 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011, 65 mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff, 66 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000, 67 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007, 68 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff, 69 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 70 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000, 71 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a, 72 0x000c, 0xffffffff, 0x0040, 73 0x000d, 0x00000040, 0x00004040, 74 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000, 75 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000, 76 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000, 77 mmSX_DEBUG_1, 0x0000007f, 0x00000020, 78 mmTA_CNTL_AUX, 0x00010000, 0x00010000, 79 mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb, 80 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b, 81 mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876, 82 mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40, 83 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010, 84 mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8, 85 mmVM_L2_CG, 0x000c0fc0, 0x000c0400, 86 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff, 87 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 88 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 89 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff, 90 }; 91 92 static const u32 tahiti_golden_registers2[] = 93 { 94 mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001, 95 }; 96 97 static const u32 tahiti_golden_rlc_registers[] = 98 { 99 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003, 100 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005, 101 0x311f, 0xffffffff, 0x10104040, 102 0x3122, 0xffffffff, 0x0100000a, 103 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800, 104 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4, 105 mmUVD_CGC_GATE, 0x00000008, 0x00000000, 106 }; 107 108 static const u32 pitcairn_golden_registers[] = 109 { 110 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011, 111 mmCB_HW_CONTROL, 0x00010000, 0x00018208, 112 mmDB_DEBUG, 0xffffffff, 0x00000000, 113 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 114 mmDB_DEBUG3, 0x0002021c, 0x00020200, 115 mmDCI_CLK_CNTL, 0x00000080, 0x00000000, 116 0x340c, 0x000300c0, 0x00800040, 117 0x360c, 0x000300c0, 0x00800040, 118 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070, 119 mmFBC_MISC, 0x00200000, 0x50100000, 120 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011, 121 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2, 122 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000, 123 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007, 124 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff, 125 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 126 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000, 127 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a, 128 0x000c, 0xffffffff, 0x0040, 129 0x000d, 0x00000040, 0x00004040, 130 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000, 131 mmSX_DEBUG_1, 0x0000007f, 0x00000020, 132 mmTA_CNTL_AUX, 0x00010000, 0x00010000, 133 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7, 134 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000, 135 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054, 136 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010, 137 mmVM_L2_CG, 0x000c0fc0, 0x000c0400, 138 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff, 139 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 140 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 141 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff, 142 }; 143 144 static const u32 pitcairn_golden_rlc_registers[] = 145 { 146 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003, 147 mmRLC_LB_PARAMS, 0xffffffff, 0x00601004, 148 0x311f, 0xffffffff, 0x10102020, 149 0x3122, 0xffffffff, 0x01000020, 150 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800, 151 mmRLC_LB_CNTL, 0xffffffff, 0x800000a4, 152 }; 153 154 static const u32 verde_pg_init[] = 155 { 156 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000, 157 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff, 158 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 159 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 160 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 161 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 162 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 163 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007, 164 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff, 165 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 166 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 167 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 168 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 169 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 170 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000, 171 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff, 172 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 173 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 174 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 175 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 176 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 177 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200, 178 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff, 179 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 180 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 181 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 182 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 183 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 184 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16, 185 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff, 186 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 187 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 188 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 189 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 190 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 191 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e, 192 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff, 193 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 194 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 195 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 196 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 197 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 198 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0, 199 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff, 200 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0, 201 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800, 202 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf, 203 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf, 204 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4, 205 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e, 206 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff, 207 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff, 208 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8, 209 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500, 210 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12, 211 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c, 212 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d, 213 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c, 214 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a, 215 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e, 216 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d, 217 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546, 218 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30, 219 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e, 220 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c, 221 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f, 222 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f, 223 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567, 224 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42, 225 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f, 226 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45, 227 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572, 228 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48, 229 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575, 230 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c, 231 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801, 232 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67, 233 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a, 234 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a, 235 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d, 236 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87, 237 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851, 238 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba, 239 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891, 240 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc, 241 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893, 242 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe, 243 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895, 244 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2, 245 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899, 246 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6, 247 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d, 248 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca, 249 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1, 250 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc, 251 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3, 252 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce, 253 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5, 254 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3, 255 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd, 256 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142, 257 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a, 258 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1, 259 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144, 260 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b, 261 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165, 262 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d, 263 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173, 264 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d, 265 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184, 266 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f, 267 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b, 268 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998, 269 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9, 270 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7, 271 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af, 272 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc, 273 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1, 274 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800, 275 mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000, 276 mmGMCON_MISC2, 0xfc00, 0x2000, 277 mmGMCON_MISC3, 0xffffffff, 0xfc0, 278 mmMC_PMG_AUTO_CFG, 0x00000100, 0x100, 279 }; 280 281 static const u32 verde_golden_rlc_registers[] = 282 { 283 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002, 284 mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005, 285 0x311f, 0xffffffff, 0x10808020, 286 0x3122, 0xffffffff, 0x00800008, 287 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000, 288 mmRLC_LB_CNTL, 0xffffffff, 0x80010014, 289 }; 290 291 static const u32 verde_golden_registers[] = 292 { 293 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011, 294 mmCB_HW_CONTROL, 0x00010000, 0x00018208, 295 mmDB_DEBUG, 0xffffffff, 0x00000000, 296 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 297 mmDB_DEBUG3, 0x0002021c, 0x00020200, 298 mmDCI_CLK_CNTL, 0x00000080, 0x00000000, 299 0x340c, 0x000300c0, 0x00800040, 300 0x360c, 0x000300c0, 0x00800040, 301 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070, 302 mmFBC_MISC, 0x00200000, 0x50100000, 303 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011, 304 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2, 305 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000, 306 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007, 307 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff, 308 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 309 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000, 310 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a, 311 0x000c, 0xffffffff, 0x0040, 312 0x000d, 0x00000040, 0x00004040, 313 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000, 314 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000, 315 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000, 316 mmSX_DEBUG_1, 0x0000007f, 0x00000020, 317 mmTA_CNTL_AUX, 0x00010000, 0x00010000, 318 mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003, 319 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000, 320 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032, 321 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010, 322 mmVM_L2_CG, 0x000c0fc0, 0x000c0400, 323 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff, 324 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 325 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 326 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff, 327 }; 328 329 static const u32 oland_golden_registers[] = 330 { 331 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011, 332 mmCB_HW_CONTROL, 0x00010000, 0x00018208, 333 mmDB_DEBUG, 0xffffffff, 0x00000000, 334 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 335 mmDB_DEBUG3, 0x0002021c, 0x00020200, 336 mmDCI_CLK_CNTL, 0x00000080, 0x00000000, 337 0x340c, 0x000300c0, 0x00800040, 338 0x360c, 0x000300c0, 0x00800040, 339 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070, 340 mmFBC_MISC, 0x00200000, 0x50100000, 341 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011, 342 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2, 343 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000, 344 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007, 345 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff, 346 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 347 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000, 348 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082, 349 0x000c, 0xffffffff, 0x0040, 350 0x000d, 0x00000040, 0x00004040, 351 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000, 352 mmSX_DEBUG_1, 0x0000007f, 0x00000020, 353 mmTA_CNTL_AUX, 0x00010000, 0x00010000, 354 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3, 355 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000, 356 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210, 357 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010, 358 mmVM_L2_CG, 0x000c0fc0, 0x000c0400, 359 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff, 360 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 361 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 362 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff, 363 364 }; 365 366 static const u32 oland_golden_rlc_registers[] = 367 { 368 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002, 369 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005, 370 0x311f, 0xffffffff, 0x10104040, 371 0x3122, 0xffffffff, 0x0100000a, 372 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800, 373 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4, 374 }; 375 376 static const u32 hainan_golden_registers[] = 377 { 378 0x17bc, 0x00000030, 0x00000011, 379 mmCB_HW_CONTROL, 0x00010000, 0x00018208, 380 mmDB_DEBUG, 0xffffffff, 0x00000000, 381 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 382 mmDB_DEBUG3, 0x0002021c, 0x00020200, 383 0x031e, 0x00000080, 0x00000000, 384 0x3430, 0xff000fff, 0x00000100, 385 0x340c, 0x000300c0, 0x00800040, 386 0x3630, 0xff000fff, 0x00000100, 387 0x360c, 0x000300c0, 0x00800040, 388 0x16ec, 0x000000f0, 0x00000070, 389 0x16f0, 0x00200000, 0x50100000, 390 0x1c0c, 0x31000311, 0x00000011, 391 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2, 392 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000, 393 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007, 394 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff, 395 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 396 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000, 397 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000, 398 0x000c, 0xffffffff, 0x0040, 399 0x000d, 0x00000040, 0x00004040, 400 mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000, 401 mmSX_DEBUG_1, 0x0000007f, 0x00000020, 402 mmTA_CNTL_AUX, 0x00010000, 0x00010000, 403 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1, 404 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000, 405 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210, 406 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010, 407 mmVM_L2_CG, 0x000c0fc0, 0x000c0400, 408 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff, 409 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 410 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 411 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff, 412 }; 413 414 static const u32 hainan_golden_registers2[] = 415 { 416 mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003, 417 }; 418 419 static const u32 tahiti_mgcg_cgcg_init[] = 420 { 421 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc, 422 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 423 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 424 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 425 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 426 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 427 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 428 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 429 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, 430 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, 431 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, 432 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, 433 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, 434 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, 435 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, 436 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, 437 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, 438 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, 439 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, 440 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, 441 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, 442 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, 443 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, 444 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 445 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 446 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, 447 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 448 0x2458, 0xffffffff, 0x00010000, 449 0x2459, 0xffffffff, 0x00030002, 450 0x245a, 0xffffffff, 0x00040007, 451 0x245b, 0xffffffff, 0x00060005, 452 0x245c, 0xffffffff, 0x00090008, 453 0x245d, 0xffffffff, 0x00020001, 454 0x245e, 0xffffffff, 0x00040003, 455 0x245f, 0xffffffff, 0x00000007, 456 0x2460, 0xffffffff, 0x00060005, 457 0x2461, 0xffffffff, 0x00090008, 458 0x2462, 0xffffffff, 0x00030002, 459 0x2463, 0xffffffff, 0x00050004, 460 0x2464, 0xffffffff, 0x00000008, 461 0x2465, 0xffffffff, 0x00070006, 462 0x2466, 0xffffffff, 0x000a0009, 463 0x2467, 0xffffffff, 0x00040003, 464 0x2468, 0xffffffff, 0x00060005, 465 0x2469, 0xffffffff, 0x00000009, 466 0x246a, 0xffffffff, 0x00080007, 467 0x246b, 0xffffffff, 0x000b000a, 468 0x246c, 0xffffffff, 0x00050004, 469 0x246d, 0xffffffff, 0x00070006, 470 0x246e, 0xffffffff, 0x0008000b, 471 0x246f, 0xffffffff, 0x000a0009, 472 0x2470, 0xffffffff, 0x000d000c, 473 0x2471, 0xffffffff, 0x00060005, 474 0x2472, 0xffffffff, 0x00080007, 475 0x2473, 0xffffffff, 0x0000000b, 476 0x2474, 0xffffffff, 0x000a0009, 477 0x2475, 0xffffffff, 0x000d000c, 478 0x2476, 0xffffffff, 0x00070006, 479 0x2477, 0xffffffff, 0x00090008, 480 0x2478, 0xffffffff, 0x0000000c, 481 0x2479, 0xffffffff, 0x000b000a, 482 0x247a, 0xffffffff, 0x000e000d, 483 0x247b, 0xffffffff, 0x00080007, 484 0x247c, 0xffffffff, 0x000a0009, 485 0x247d, 0xffffffff, 0x0000000d, 486 0x247e, 0xffffffff, 0x000c000b, 487 0x247f, 0xffffffff, 0x000f000e, 488 0x2480, 0xffffffff, 0x00090008, 489 0x2481, 0xffffffff, 0x000b000a, 490 0x2482, 0xffffffff, 0x000c000f, 491 0x2483, 0xffffffff, 0x000e000d, 492 0x2484, 0xffffffff, 0x00110010, 493 0x2485, 0xffffffff, 0x000a0009, 494 0x2486, 0xffffffff, 0x000c000b, 495 0x2487, 0xffffffff, 0x0000000f, 496 0x2488, 0xffffffff, 0x000e000d, 497 0x2489, 0xffffffff, 0x00110010, 498 0x248a, 0xffffffff, 0x000b000a, 499 0x248b, 0xffffffff, 0x000d000c, 500 0x248c, 0xffffffff, 0x00000010, 501 0x248d, 0xffffffff, 0x000f000e, 502 0x248e, 0xffffffff, 0x00120011, 503 0x248f, 0xffffffff, 0x000c000b, 504 0x2490, 0xffffffff, 0x000e000d, 505 0x2491, 0xffffffff, 0x00000011, 506 0x2492, 0xffffffff, 0x0010000f, 507 0x2493, 0xffffffff, 0x00130012, 508 0x2494, 0xffffffff, 0x000d000c, 509 0x2495, 0xffffffff, 0x000f000e, 510 0x2496, 0xffffffff, 0x00100013, 511 0x2497, 0xffffffff, 0x00120011, 512 0x2498, 0xffffffff, 0x00150014, 513 0x2499, 0xffffffff, 0x000e000d, 514 0x249a, 0xffffffff, 0x0010000f, 515 0x249b, 0xffffffff, 0x00000013, 516 0x249c, 0xffffffff, 0x00120011, 517 0x249d, 0xffffffff, 0x00150014, 518 0x249e, 0xffffffff, 0x000f000e, 519 0x249f, 0xffffffff, 0x00110010, 520 0x24a0, 0xffffffff, 0x00000014, 521 0x24a1, 0xffffffff, 0x00130012, 522 0x24a2, 0xffffffff, 0x00160015, 523 0x24a3, 0xffffffff, 0x0010000f, 524 0x24a4, 0xffffffff, 0x00120011, 525 0x24a5, 0xffffffff, 0x00000015, 526 0x24a6, 0xffffffff, 0x00140013, 527 0x24a7, 0xffffffff, 0x00170016, 528 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 529 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 530 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080, 531 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f, 532 0x000c, 0xffffffff, 0x0000001c, 533 0x000d, 0x000f0000, 0x000f0000, 534 0x0583, 0xffffffff, 0x00000100, 535 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100, 536 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000, 537 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104, 538 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000, 539 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000, 540 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 541 0x157a, 0x00000001, 0x00000001, 542 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001, 543 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 544 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 545 0x3430, 0xfffffff0, 0x00000100, 546 0x3630, 0xfffffff0, 0x00000100, 547 }; 548 static const u32 pitcairn_mgcg_cgcg_init[] = 549 { 550 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc, 551 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 552 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 553 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 554 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 555 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 556 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 557 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 558 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, 559 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, 560 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, 561 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, 562 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, 563 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, 564 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, 565 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, 566 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, 567 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, 568 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, 569 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, 570 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, 571 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, 572 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, 573 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 574 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 575 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, 576 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 577 0x2458, 0xffffffff, 0x00010000, 578 0x2459, 0xffffffff, 0x00030002, 579 0x245a, 0xffffffff, 0x00040007, 580 0x245b, 0xffffffff, 0x00060005, 581 0x245c, 0xffffffff, 0x00090008, 582 0x245d, 0xffffffff, 0x00020001, 583 0x245e, 0xffffffff, 0x00040003, 584 0x245f, 0xffffffff, 0x00000007, 585 0x2460, 0xffffffff, 0x00060005, 586 0x2461, 0xffffffff, 0x00090008, 587 0x2462, 0xffffffff, 0x00030002, 588 0x2463, 0xffffffff, 0x00050004, 589 0x2464, 0xffffffff, 0x00000008, 590 0x2465, 0xffffffff, 0x00070006, 591 0x2466, 0xffffffff, 0x000a0009, 592 0x2467, 0xffffffff, 0x00040003, 593 0x2468, 0xffffffff, 0x00060005, 594 0x2469, 0xffffffff, 0x00000009, 595 0x246a, 0xffffffff, 0x00080007, 596 0x246b, 0xffffffff, 0x000b000a, 597 0x246c, 0xffffffff, 0x00050004, 598 0x246d, 0xffffffff, 0x00070006, 599 0x246e, 0xffffffff, 0x0008000b, 600 0x246f, 0xffffffff, 0x000a0009, 601 0x2470, 0xffffffff, 0x000d000c, 602 0x2480, 0xffffffff, 0x00090008, 603 0x2481, 0xffffffff, 0x000b000a, 604 0x2482, 0xffffffff, 0x000c000f, 605 0x2483, 0xffffffff, 0x000e000d, 606 0x2484, 0xffffffff, 0x00110010, 607 0x2485, 0xffffffff, 0x000a0009, 608 0x2486, 0xffffffff, 0x000c000b, 609 0x2487, 0xffffffff, 0x0000000f, 610 0x2488, 0xffffffff, 0x000e000d, 611 0x2489, 0xffffffff, 0x00110010, 612 0x248a, 0xffffffff, 0x000b000a, 613 0x248b, 0xffffffff, 0x000d000c, 614 0x248c, 0xffffffff, 0x00000010, 615 0x248d, 0xffffffff, 0x000f000e, 616 0x248e, 0xffffffff, 0x00120011, 617 0x248f, 0xffffffff, 0x000c000b, 618 0x2490, 0xffffffff, 0x000e000d, 619 0x2491, 0xffffffff, 0x00000011, 620 0x2492, 0xffffffff, 0x0010000f, 621 0x2493, 0xffffffff, 0x00130012, 622 0x2494, 0xffffffff, 0x000d000c, 623 0x2495, 0xffffffff, 0x000f000e, 624 0x2496, 0xffffffff, 0x00100013, 625 0x2497, 0xffffffff, 0x00120011, 626 0x2498, 0xffffffff, 0x00150014, 627 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 628 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 629 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080, 630 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f, 631 0x000c, 0xffffffff, 0x0000001c, 632 0x000d, 0x000f0000, 0x000f0000, 633 0x0583, 0xffffffff, 0x00000100, 634 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100, 635 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000, 636 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104, 637 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 638 0x157a, 0x00000001, 0x00000001, 639 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001, 640 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 641 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 642 0x3430, 0xfffffff0, 0x00000100, 643 0x3630, 0xfffffff0, 0x00000100, 644 }; 645 646 static const u32 verde_mgcg_cgcg_init[] = 647 { 648 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc, 649 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 650 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 651 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 652 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 653 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 654 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 655 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 656 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, 657 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, 658 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, 659 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, 660 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, 661 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, 662 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, 663 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, 664 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, 665 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, 666 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, 667 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, 668 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, 669 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, 670 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, 671 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 672 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 673 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, 674 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 675 0x2458, 0xffffffff, 0x00010000, 676 0x2459, 0xffffffff, 0x00030002, 677 0x245a, 0xffffffff, 0x00040007, 678 0x245b, 0xffffffff, 0x00060005, 679 0x245c, 0xffffffff, 0x00090008, 680 0x245d, 0xffffffff, 0x00020001, 681 0x245e, 0xffffffff, 0x00040003, 682 0x245f, 0xffffffff, 0x00000007, 683 0x2460, 0xffffffff, 0x00060005, 684 0x2461, 0xffffffff, 0x00090008, 685 0x2462, 0xffffffff, 0x00030002, 686 0x2463, 0xffffffff, 0x00050004, 687 0x2464, 0xffffffff, 0x00000008, 688 0x2465, 0xffffffff, 0x00070006, 689 0x2466, 0xffffffff, 0x000a0009, 690 0x2467, 0xffffffff, 0x00040003, 691 0x2468, 0xffffffff, 0x00060005, 692 0x2469, 0xffffffff, 0x00000009, 693 0x246a, 0xffffffff, 0x00080007, 694 0x246b, 0xffffffff, 0x000b000a, 695 0x246c, 0xffffffff, 0x00050004, 696 0x246d, 0xffffffff, 0x00070006, 697 0x246e, 0xffffffff, 0x0008000b, 698 0x246f, 0xffffffff, 0x000a0009, 699 0x2470, 0xffffffff, 0x000d000c, 700 0x2480, 0xffffffff, 0x00090008, 701 0x2481, 0xffffffff, 0x000b000a, 702 0x2482, 0xffffffff, 0x000c000f, 703 0x2483, 0xffffffff, 0x000e000d, 704 0x2484, 0xffffffff, 0x00110010, 705 0x2485, 0xffffffff, 0x000a0009, 706 0x2486, 0xffffffff, 0x000c000b, 707 0x2487, 0xffffffff, 0x0000000f, 708 0x2488, 0xffffffff, 0x000e000d, 709 0x2489, 0xffffffff, 0x00110010, 710 0x248a, 0xffffffff, 0x000b000a, 711 0x248b, 0xffffffff, 0x000d000c, 712 0x248c, 0xffffffff, 0x00000010, 713 0x248d, 0xffffffff, 0x000f000e, 714 0x248e, 0xffffffff, 0x00120011, 715 0x248f, 0xffffffff, 0x000c000b, 716 0x2490, 0xffffffff, 0x000e000d, 717 0x2491, 0xffffffff, 0x00000011, 718 0x2492, 0xffffffff, 0x0010000f, 719 0x2493, 0xffffffff, 0x00130012, 720 0x2494, 0xffffffff, 0x000d000c, 721 0x2495, 0xffffffff, 0x000f000e, 722 0x2496, 0xffffffff, 0x00100013, 723 0x2497, 0xffffffff, 0x00120011, 724 0x2498, 0xffffffff, 0x00150014, 725 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 726 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 727 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080, 728 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f, 729 0x000c, 0xffffffff, 0x0000001c, 730 0x000d, 0x000f0000, 0x000f0000, 731 0x0583, 0xffffffff, 0x00000100, 732 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100, 733 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000, 734 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104, 735 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000, 736 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000, 737 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 738 0x157a, 0x00000001, 0x00000001, 739 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001, 740 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 741 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 742 0x3430, 0xfffffff0, 0x00000100, 743 0x3630, 0xfffffff0, 0x00000100, 744 }; 745 746 static const u32 oland_mgcg_cgcg_init[] = 747 { 748 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc, 749 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 750 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 751 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 752 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 753 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 754 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 755 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 756 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, 757 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, 758 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, 759 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, 760 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, 761 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, 762 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, 763 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, 764 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, 765 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, 766 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, 767 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, 768 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, 769 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, 770 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, 771 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 772 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 773 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, 774 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 775 0x2458, 0xffffffff, 0x00010000, 776 0x2459, 0xffffffff, 0x00030002, 777 0x245a, 0xffffffff, 0x00040007, 778 0x245b, 0xffffffff, 0x00060005, 779 0x245c, 0xffffffff, 0x00090008, 780 0x245d, 0xffffffff, 0x00020001, 781 0x245e, 0xffffffff, 0x00040003, 782 0x245f, 0xffffffff, 0x00000007, 783 0x2460, 0xffffffff, 0x00060005, 784 0x2461, 0xffffffff, 0x00090008, 785 0x2462, 0xffffffff, 0x00030002, 786 0x2463, 0xffffffff, 0x00050004, 787 0x2464, 0xffffffff, 0x00000008, 788 0x2465, 0xffffffff, 0x00070006, 789 0x2466, 0xffffffff, 0x000a0009, 790 0x2467, 0xffffffff, 0x00040003, 791 0x2468, 0xffffffff, 0x00060005, 792 0x2469, 0xffffffff, 0x00000009, 793 0x246a, 0xffffffff, 0x00080007, 794 0x246b, 0xffffffff, 0x000b000a, 795 0x246c, 0xffffffff, 0x00050004, 796 0x246d, 0xffffffff, 0x00070006, 797 0x246e, 0xffffffff, 0x0008000b, 798 0x246f, 0xffffffff, 0x000a0009, 799 0x2470, 0xffffffff, 0x000d000c, 800 0x2471, 0xffffffff, 0x00060005, 801 0x2472, 0xffffffff, 0x00080007, 802 0x2473, 0xffffffff, 0x0000000b, 803 0x2474, 0xffffffff, 0x000a0009, 804 0x2475, 0xffffffff, 0x000d000c, 805 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 806 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 807 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080, 808 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f, 809 0x000c, 0xffffffff, 0x0000001c, 810 0x000d, 0x000f0000, 0x000f0000, 811 0x0583, 0xffffffff, 0x00000100, 812 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100, 813 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000, 814 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104, 815 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000, 816 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000, 817 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 818 0x157a, 0x00000001, 0x00000001, 819 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001, 820 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 821 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 822 0x3430, 0xfffffff0, 0x00000100, 823 0x3630, 0xfffffff0, 0x00000100, 824 }; 825 826 static const u32 hainan_mgcg_cgcg_init[] = 827 { 828 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc, 829 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 830 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 831 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 832 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 833 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 834 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 835 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 836 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, 837 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, 838 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, 839 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, 840 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, 841 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, 842 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, 843 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, 844 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, 845 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, 846 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, 847 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, 848 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, 849 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, 850 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, 851 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 852 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 853 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, 854 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 855 0x2458, 0xffffffff, 0x00010000, 856 0x2459, 0xffffffff, 0x00030002, 857 0x245a, 0xffffffff, 0x00040007, 858 0x245b, 0xffffffff, 0x00060005, 859 0x245c, 0xffffffff, 0x00090008, 860 0x245d, 0xffffffff, 0x00020001, 861 0x245e, 0xffffffff, 0x00040003, 862 0x245f, 0xffffffff, 0x00000007, 863 0x2460, 0xffffffff, 0x00060005, 864 0x2461, 0xffffffff, 0x00090008, 865 0x2462, 0xffffffff, 0x00030002, 866 0x2463, 0xffffffff, 0x00050004, 867 0x2464, 0xffffffff, 0x00000008, 868 0x2465, 0xffffffff, 0x00070006, 869 0x2466, 0xffffffff, 0x000a0009, 870 0x2467, 0xffffffff, 0x00040003, 871 0x2468, 0xffffffff, 0x00060005, 872 0x2469, 0xffffffff, 0x00000009, 873 0x246a, 0xffffffff, 0x00080007, 874 0x246b, 0xffffffff, 0x000b000a, 875 0x246c, 0xffffffff, 0x00050004, 876 0x246d, 0xffffffff, 0x00070006, 877 0x246e, 0xffffffff, 0x0008000b, 878 0x246f, 0xffffffff, 0x000a0009, 879 0x2470, 0xffffffff, 0x000d000c, 880 0x2471, 0xffffffff, 0x00060005, 881 0x2472, 0xffffffff, 0x00080007, 882 0x2473, 0xffffffff, 0x0000000b, 883 0x2474, 0xffffffff, 0x000a0009, 884 0x2475, 0xffffffff, 0x000d000c, 885 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 886 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 887 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080, 888 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f, 889 0x000c, 0xffffffff, 0x0000001c, 890 0x000d, 0x000f0000, 0x000f0000, 891 0x0583, 0xffffffff, 0x00000100, 892 0x0409, 0xffffffff, 0x00000100, 893 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104, 894 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000, 895 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000, 896 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001, 897 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 898 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 899 0x3430, 0xfffffff0, 0x00000100, 900 0x3630, 0xfffffff0, 0x00000100, 901 }; 902 903 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg) 904 { 905 unsigned long flags; 906 u32 r; 907 908 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 909 WREG32(AMDGPU_PCIE_INDEX, reg); 910 (void)RREG32(AMDGPU_PCIE_INDEX); 911 r = RREG32(AMDGPU_PCIE_DATA); 912 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 913 return r; 914 } 915 916 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 917 { 918 unsigned long flags; 919 920 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 921 WREG32(AMDGPU_PCIE_INDEX, reg); 922 (void)RREG32(AMDGPU_PCIE_INDEX); 923 WREG32(AMDGPU_PCIE_DATA, v); 924 (void)RREG32(AMDGPU_PCIE_DATA); 925 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 926 } 927 928 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg) 929 { 930 unsigned long flags; 931 u32 r; 932 933 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 934 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 935 (void)RREG32(PCIE_PORT_INDEX); 936 r = RREG32(PCIE_PORT_DATA); 937 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 938 return r; 939 } 940 941 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 942 { 943 unsigned long flags; 944 945 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 946 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 947 (void)RREG32(PCIE_PORT_INDEX); 948 WREG32(PCIE_PORT_DATA, (v)); 949 (void)RREG32(PCIE_PORT_DATA); 950 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 951 } 952 953 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg) 954 { 955 unsigned long flags; 956 u32 r; 957 958 spin_lock_irqsave(&adev->smc_idx_lock, flags); 959 WREG32(SMC_IND_INDEX_0, (reg)); 960 r = RREG32(SMC_IND_DATA_0); 961 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 962 return r; 963 } 964 965 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 966 { 967 unsigned long flags; 968 969 spin_lock_irqsave(&adev->smc_idx_lock, flags); 970 WREG32(SMC_IND_INDEX_0, (reg)); 971 WREG32(SMC_IND_DATA_0, (v)); 972 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 973 } 974 975 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = { 976 {GRBM_STATUS}, 977 {GB_ADDR_CONFIG}, 978 {MC_ARB_RAMCFG}, 979 {GB_TILE_MODE0}, 980 {GB_TILE_MODE1}, 981 {GB_TILE_MODE2}, 982 {GB_TILE_MODE3}, 983 {GB_TILE_MODE4}, 984 {GB_TILE_MODE5}, 985 {GB_TILE_MODE6}, 986 {GB_TILE_MODE7}, 987 {GB_TILE_MODE8}, 988 {GB_TILE_MODE9}, 989 {GB_TILE_MODE10}, 990 {GB_TILE_MODE11}, 991 {GB_TILE_MODE12}, 992 {GB_TILE_MODE13}, 993 {GB_TILE_MODE14}, 994 {GB_TILE_MODE15}, 995 {GB_TILE_MODE16}, 996 {GB_TILE_MODE17}, 997 {GB_TILE_MODE18}, 998 {GB_TILE_MODE19}, 999 {GB_TILE_MODE20}, 1000 {GB_TILE_MODE21}, 1001 {GB_TILE_MODE22}, 1002 {GB_TILE_MODE23}, 1003 {GB_TILE_MODE24}, 1004 {GB_TILE_MODE25}, 1005 {GB_TILE_MODE26}, 1006 {GB_TILE_MODE27}, 1007 {GB_TILE_MODE28}, 1008 {GB_TILE_MODE29}, 1009 {GB_TILE_MODE30}, 1010 {GB_TILE_MODE31}, 1011 {CC_RB_BACKEND_DISABLE, true}, 1012 {GC_USER_RB_BACKEND_DISABLE, true}, 1013 {PA_SC_RASTER_CONFIG, true}, 1014 }; 1015 1016 static uint32_t si_get_register_value(struct amdgpu_device *adev, 1017 bool indexed, u32 se_num, 1018 u32 sh_num, u32 reg_offset) 1019 { 1020 if (indexed) { 1021 uint32_t val; 1022 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; 1023 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; 1024 1025 switch (reg_offset) { 1026 case mmCC_RB_BACKEND_DISABLE: 1027 return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; 1028 case mmGC_USER_RB_BACKEND_DISABLE: 1029 return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; 1030 case mmPA_SC_RASTER_CONFIG: 1031 return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; 1032 } 1033 1034 mutex_lock(&adev->grbm_idx_mutex); 1035 if (se_num != 0xffffffff || sh_num != 0xffffffff) 1036 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); 1037 1038 val = RREG32(reg_offset); 1039 1040 if (se_num != 0xffffffff || sh_num != 0xffffffff) 1041 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1042 mutex_unlock(&adev->grbm_idx_mutex); 1043 return val; 1044 } else { 1045 unsigned idx; 1046 1047 switch (reg_offset) { 1048 case mmGB_ADDR_CONFIG: 1049 return adev->gfx.config.gb_addr_config; 1050 case mmMC_ARB_RAMCFG: 1051 return adev->gfx.config.mc_arb_ramcfg; 1052 case mmGB_TILE_MODE0: 1053 case mmGB_TILE_MODE1: 1054 case mmGB_TILE_MODE2: 1055 case mmGB_TILE_MODE3: 1056 case mmGB_TILE_MODE4: 1057 case mmGB_TILE_MODE5: 1058 case mmGB_TILE_MODE6: 1059 case mmGB_TILE_MODE7: 1060 case mmGB_TILE_MODE8: 1061 case mmGB_TILE_MODE9: 1062 case mmGB_TILE_MODE10: 1063 case mmGB_TILE_MODE11: 1064 case mmGB_TILE_MODE12: 1065 case mmGB_TILE_MODE13: 1066 case mmGB_TILE_MODE14: 1067 case mmGB_TILE_MODE15: 1068 case mmGB_TILE_MODE16: 1069 case mmGB_TILE_MODE17: 1070 case mmGB_TILE_MODE18: 1071 case mmGB_TILE_MODE19: 1072 case mmGB_TILE_MODE20: 1073 case mmGB_TILE_MODE21: 1074 case mmGB_TILE_MODE22: 1075 case mmGB_TILE_MODE23: 1076 case mmGB_TILE_MODE24: 1077 case mmGB_TILE_MODE25: 1078 case mmGB_TILE_MODE26: 1079 case mmGB_TILE_MODE27: 1080 case mmGB_TILE_MODE28: 1081 case mmGB_TILE_MODE29: 1082 case mmGB_TILE_MODE30: 1083 case mmGB_TILE_MODE31: 1084 idx = (reg_offset - mmGB_TILE_MODE0); 1085 return adev->gfx.config.tile_mode_array[idx]; 1086 default: 1087 return RREG32(reg_offset); 1088 } 1089 } 1090 } 1091 static int si_read_register(struct amdgpu_device *adev, u32 se_num, 1092 u32 sh_num, u32 reg_offset, u32 *value) 1093 { 1094 uint32_t i; 1095 1096 *value = 0; 1097 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) { 1098 bool indexed = si_allowed_read_registers[i].grbm_indexed; 1099 1100 if (reg_offset != si_allowed_read_registers[i].reg_offset) 1101 continue; 1102 1103 *value = si_get_register_value(adev, indexed, se_num, sh_num, 1104 reg_offset); 1105 return 0; 1106 } 1107 return -EINVAL; 1108 } 1109 1110 static bool si_read_disabled_bios(struct amdgpu_device *adev) 1111 { 1112 u32 bus_cntl; 1113 u32 d1vga_control = 0; 1114 u32 d2vga_control = 0; 1115 u32 vga_render_control = 0; 1116 u32 rom_cntl; 1117 bool r; 1118 1119 bus_cntl = RREG32(R600_BUS_CNTL); 1120 if (adev->mode_info.num_crtc) { 1121 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); 1122 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); 1123 vga_render_control = RREG32(VGA_RENDER_CONTROL); 1124 } 1125 rom_cntl = RREG32(R600_ROM_CNTL); 1126 1127 /* enable the rom */ 1128 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); 1129 if (adev->mode_info.num_crtc) { 1130 /* Disable VGA mode */ 1131 WREG32(AVIVO_D1VGA_CONTROL, 1132 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 1133 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 1134 WREG32(AVIVO_D2VGA_CONTROL, 1135 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 1136 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 1137 WREG32(VGA_RENDER_CONTROL, 1138 (vga_render_control & C_000300_VGA_VSTATUS_CNTL)); 1139 } 1140 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE); 1141 1142 r = amdgpu_read_bios(adev); 1143 1144 /* restore regs */ 1145 WREG32(R600_BUS_CNTL, bus_cntl); 1146 if (adev->mode_info.num_crtc) { 1147 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); 1148 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); 1149 WREG32(VGA_RENDER_CONTROL, vga_render_control); 1150 } 1151 WREG32(R600_ROM_CNTL, rom_cntl); 1152 return r; 1153 } 1154 1155 #define mmROM_INDEX 0x2A 1156 #define mmROM_DATA 0x2B 1157 1158 static bool si_read_bios_from_rom(struct amdgpu_device *adev, 1159 u8 *bios, u32 length_bytes) 1160 { 1161 u32 *dw_ptr; 1162 u32 i, length_dw; 1163 1164 if (bios == NULL) 1165 return false; 1166 if (length_bytes == 0) 1167 return false; 1168 /* APU vbios image is part of sbios image */ 1169 if (adev->flags & AMD_IS_APU) 1170 return false; 1171 1172 dw_ptr = (u32 *)bios; 1173 length_dw = ALIGN(length_bytes, 4) / 4; 1174 /* set rom index to 0 */ 1175 WREG32(mmROM_INDEX, 0); 1176 for (i = 0; i < length_dw; i++) 1177 dw_ptr[i] = RREG32(mmROM_DATA); 1178 1179 return true; 1180 } 1181 1182 //xxx: not implemented 1183 static int si_asic_reset(struct amdgpu_device *adev) 1184 { 1185 return 0; 1186 } 1187 1188 static u32 si_get_config_memsize(struct amdgpu_device *adev) 1189 { 1190 return RREG32(mmCONFIG_MEMSIZE); 1191 } 1192 1193 static void si_vga_set_state(struct amdgpu_device *adev, bool state) 1194 { 1195 uint32_t temp; 1196 1197 temp = RREG32(CONFIG_CNTL); 1198 if (state == false) { 1199 temp &= ~(1<<0); 1200 temp |= (1<<1); 1201 } else { 1202 temp &= ~(1<<1); 1203 } 1204 WREG32(CONFIG_CNTL, temp); 1205 } 1206 1207 static u32 si_get_xclk(struct amdgpu_device *adev) 1208 { 1209 u32 reference_clock = adev->clock.spll.reference_freq; 1210 u32 tmp; 1211 1212 tmp = RREG32(CG_CLKPIN_CNTL_2); 1213 if (tmp & MUX_TCLK_TO_XCLK) 1214 return TCLK; 1215 1216 tmp = RREG32(CG_CLKPIN_CNTL); 1217 if (tmp & XTALIN_DIVIDE) 1218 return reference_clock / 4; 1219 1220 return reference_clock; 1221 } 1222 1223 //xxx:not implemented 1224 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk) 1225 { 1226 return 0; 1227 } 1228 1229 static void si_detect_hw_virtualization(struct amdgpu_device *adev) 1230 { 1231 if (is_virtual_machine()) /* passthrough mode */ 1232 adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; 1233 } 1234 1235 static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring) 1236 { 1237 if (!ring || !ring->funcs->emit_wreg) { 1238 WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 1239 RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL); 1240 } else { 1241 amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 1242 } 1243 } 1244 1245 static void si_invalidate_hdp(struct amdgpu_device *adev, 1246 struct amdgpu_ring *ring) 1247 { 1248 if (!ring || !ring->funcs->emit_wreg) { 1249 WREG32(mmHDP_DEBUG0, 1); 1250 RREG32(mmHDP_DEBUG0); 1251 } else { 1252 amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1); 1253 } 1254 } 1255 1256 static bool si_need_full_reset(struct amdgpu_device *adev) 1257 { 1258 /* change this when we support soft reset */ 1259 return true; 1260 } 1261 1262 static bool si_need_reset_on_init(struct amdgpu_device *adev) 1263 { 1264 return false; 1265 } 1266 1267 static int si_get_pcie_lanes(struct amdgpu_device *adev) 1268 { 1269 u32 link_width_cntl; 1270 1271 if (adev->flags & AMD_IS_APU) 1272 return 0; 1273 1274 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 1275 1276 switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) { 1277 case LC_LINK_WIDTH_X1: 1278 return 1; 1279 case LC_LINK_WIDTH_X2: 1280 return 2; 1281 case LC_LINK_WIDTH_X4: 1282 return 4; 1283 case LC_LINK_WIDTH_X8: 1284 return 8; 1285 case LC_LINK_WIDTH_X0: 1286 case LC_LINK_WIDTH_X16: 1287 default: 1288 return 16; 1289 } 1290 } 1291 1292 static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes) 1293 { 1294 u32 link_width_cntl, mask; 1295 1296 if (adev->flags & AMD_IS_APU) 1297 return; 1298 1299 switch (lanes) { 1300 case 0: 1301 mask = LC_LINK_WIDTH_X0; 1302 break; 1303 case 1: 1304 mask = LC_LINK_WIDTH_X1; 1305 break; 1306 case 2: 1307 mask = LC_LINK_WIDTH_X2; 1308 break; 1309 case 4: 1310 mask = LC_LINK_WIDTH_X4; 1311 break; 1312 case 8: 1313 mask = LC_LINK_WIDTH_X8; 1314 break; 1315 case 16: 1316 mask = LC_LINK_WIDTH_X16; 1317 break; 1318 default: 1319 DRM_ERROR("invalid pcie lane request: %d\n", lanes); 1320 return; 1321 } 1322 1323 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 1324 link_width_cntl &= ~LC_LINK_WIDTH_MASK; 1325 link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT; 1326 link_width_cntl |= (LC_RECONFIG_NOW | 1327 LC_RECONFIG_ARC_MISSING_ESCAPE); 1328 1329 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 1330 } 1331 1332 static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0, 1333 uint64_t *count1) 1334 { 1335 uint32_t perfctr = 0; 1336 uint64_t cnt0_of, cnt1_of; 1337 int tmp; 1338 1339 /* This reports 0 on APUs, so return to avoid writing/reading registers 1340 * that may or may not be different from their GPU counterparts 1341 */ 1342 if (adev->flags & AMD_IS_APU) 1343 return; 1344 1345 /* Set the 2 events that we wish to watch, defined above */ 1346 /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */ 1347 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40); 1348 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104); 1349 1350 /* Write to enable desired perf counters */ 1351 WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr); 1352 /* Zero out and enable the perf counters 1353 * Write 0x5: 1354 * Bit 0 = Start all counters(1) 1355 * Bit 2 = Global counter reset enable(1) 1356 */ 1357 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005); 1358 1359 msleep(1000); 1360 1361 /* Load the shadow and disable the perf counters 1362 * Write 0x2: 1363 * Bit 0 = Stop counters(0) 1364 * Bit 1 = Load the shadow counters(1) 1365 */ 1366 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002); 1367 1368 /* Read register values to get any >32bit overflow */ 1369 tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK); 1370 cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER); 1371 cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER); 1372 1373 /* Get the values and add the overflow */ 1374 *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32); 1375 *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32); 1376 } 1377 1378 static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev) 1379 { 1380 uint64_t nak_r, nak_g; 1381 1382 /* Get the number of NAKs received and generated */ 1383 nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK); 1384 nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED); 1385 1386 /* Add the total number of NAKs, i.e the number of replays */ 1387 return (nak_r + nak_g); 1388 } 1389 1390 static const struct amdgpu_asic_funcs si_asic_funcs = 1391 { 1392 .read_disabled_bios = &si_read_disabled_bios, 1393 .read_bios_from_rom = &si_read_bios_from_rom, 1394 .read_register = &si_read_register, 1395 .reset = &si_asic_reset, 1396 .set_vga_state = &si_vga_set_state, 1397 .get_xclk = &si_get_xclk, 1398 .set_uvd_clocks = &si_set_uvd_clocks, 1399 .set_vce_clocks = NULL, 1400 .get_pcie_lanes = &si_get_pcie_lanes, 1401 .set_pcie_lanes = &si_set_pcie_lanes, 1402 .get_config_memsize = &si_get_config_memsize, 1403 .flush_hdp = &si_flush_hdp, 1404 .invalidate_hdp = &si_invalidate_hdp, 1405 .need_full_reset = &si_need_full_reset, 1406 .get_pcie_usage = &si_get_pcie_usage, 1407 .need_reset_on_init = &si_need_reset_on_init, 1408 .get_pcie_replay_count = &si_get_pcie_replay_count, 1409 }; 1410 1411 static uint32_t si_get_rev_id(struct amdgpu_device *adev) 1412 { 1413 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK) 1414 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT; 1415 } 1416 1417 static int si_common_early_init(void *handle) 1418 { 1419 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1420 1421 adev->smc_rreg = &si_smc_rreg; 1422 adev->smc_wreg = &si_smc_wreg; 1423 adev->pcie_rreg = &si_pcie_rreg; 1424 adev->pcie_wreg = &si_pcie_wreg; 1425 adev->pciep_rreg = &si_pciep_rreg; 1426 adev->pciep_wreg = &si_pciep_wreg; 1427 adev->uvd_ctx_rreg = NULL; 1428 adev->uvd_ctx_wreg = NULL; 1429 adev->didt_rreg = NULL; 1430 adev->didt_wreg = NULL; 1431 1432 adev->asic_funcs = &si_asic_funcs; 1433 1434 adev->rev_id = si_get_rev_id(adev); 1435 adev->external_rev_id = 0xFF; 1436 switch (adev->asic_type) { 1437 case CHIP_TAHITI: 1438 adev->cg_flags = 1439 AMD_CG_SUPPORT_GFX_MGCG | 1440 AMD_CG_SUPPORT_GFX_MGLS | 1441 /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1442 AMD_CG_SUPPORT_GFX_CGLS | 1443 AMD_CG_SUPPORT_GFX_CGTS | 1444 AMD_CG_SUPPORT_GFX_CP_LS | 1445 AMD_CG_SUPPORT_MC_MGCG | 1446 AMD_CG_SUPPORT_SDMA_MGCG | 1447 AMD_CG_SUPPORT_BIF_LS | 1448 AMD_CG_SUPPORT_VCE_MGCG | 1449 AMD_CG_SUPPORT_UVD_MGCG | 1450 AMD_CG_SUPPORT_HDP_LS | 1451 AMD_CG_SUPPORT_HDP_MGCG; 1452 adev->pg_flags = 0; 1453 adev->external_rev_id = (adev->rev_id == 0) ? 1 : 1454 (adev->rev_id == 1) ? 5 : 6; 1455 break; 1456 case CHIP_PITCAIRN: 1457 adev->cg_flags = 1458 AMD_CG_SUPPORT_GFX_MGCG | 1459 AMD_CG_SUPPORT_GFX_MGLS | 1460 /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1461 AMD_CG_SUPPORT_GFX_CGLS | 1462 AMD_CG_SUPPORT_GFX_CGTS | 1463 AMD_CG_SUPPORT_GFX_CP_LS | 1464 AMD_CG_SUPPORT_GFX_RLC_LS | 1465 AMD_CG_SUPPORT_MC_LS | 1466 AMD_CG_SUPPORT_MC_MGCG | 1467 AMD_CG_SUPPORT_SDMA_MGCG | 1468 AMD_CG_SUPPORT_BIF_LS | 1469 AMD_CG_SUPPORT_VCE_MGCG | 1470 AMD_CG_SUPPORT_UVD_MGCG | 1471 AMD_CG_SUPPORT_HDP_LS | 1472 AMD_CG_SUPPORT_HDP_MGCG; 1473 adev->pg_flags = 0; 1474 adev->external_rev_id = adev->rev_id + 20; 1475 break; 1476 1477 case CHIP_VERDE: 1478 adev->cg_flags = 1479 AMD_CG_SUPPORT_GFX_MGCG | 1480 AMD_CG_SUPPORT_GFX_MGLS | 1481 AMD_CG_SUPPORT_GFX_CGLS | 1482 AMD_CG_SUPPORT_GFX_CGTS | 1483 AMD_CG_SUPPORT_GFX_CGTS_LS | 1484 AMD_CG_SUPPORT_GFX_CP_LS | 1485 AMD_CG_SUPPORT_MC_LS | 1486 AMD_CG_SUPPORT_MC_MGCG | 1487 AMD_CG_SUPPORT_SDMA_MGCG | 1488 AMD_CG_SUPPORT_SDMA_LS | 1489 AMD_CG_SUPPORT_BIF_LS | 1490 AMD_CG_SUPPORT_VCE_MGCG | 1491 AMD_CG_SUPPORT_UVD_MGCG | 1492 AMD_CG_SUPPORT_HDP_LS | 1493 AMD_CG_SUPPORT_HDP_MGCG; 1494 adev->pg_flags = 0; 1495 //??? 1496 adev->external_rev_id = adev->rev_id + 40; 1497 break; 1498 case CHIP_OLAND: 1499 adev->cg_flags = 1500 AMD_CG_SUPPORT_GFX_MGCG | 1501 AMD_CG_SUPPORT_GFX_MGLS | 1502 /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1503 AMD_CG_SUPPORT_GFX_CGLS | 1504 AMD_CG_SUPPORT_GFX_CGTS | 1505 AMD_CG_SUPPORT_GFX_CP_LS | 1506 AMD_CG_SUPPORT_GFX_RLC_LS | 1507 AMD_CG_SUPPORT_MC_LS | 1508 AMD_CG_SUPPORT_MC_MGCG | 1509 AMD_CG_SUPPORT_SDMA_MGCG | 1510 AMD_CG_SUPPORT_BIF_LS | 1511 AMD_CG_SUPPORT_UVD_MGCG | 1512 AMD_CG_SUPPORT_HDP_LS | 1513 AMD_CG_SUPPORT_HDP_MGCG; 1514 adev->pg_flags = 0; 1515 adev->external_rev_id = 60; 1516 break; 1517 case CHIP_HAINAN: 1518 adev->cg_flags = 1519 AMD_CG_SUPPORT_GFX_MGCG | 1520 AMD_CG_SUPPORT_GFX_MGLS | 1521 /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1522 AMD_CG_SUPPORT_GFX_CGLS | 1523 AMD_CG_SUPPORT_GFX_CGTS | 1524 AMD_CG_SUPPORT_GFX_CP_LS | 1525 AMD_CG_SUPPORT_GFX_RLC_LS | 1526 AMD_CG_SUPPORT_MC_LS | 1527 AMD_CG_SUPPORT_MC_MGCG | 1528 AMD_CG_SUPPORT_SDMA_MGCG | 1529 AMD_CG_SUPPORT_BIF_LS | 1530 AMD_CG_SUPPORT_HDP_LS | 1531 AMD_CG_SUPPORT_HDP_MGCG; 1532 adev->pg_flags = 0; 1533 adev->external_rev_id = 70; 1534 break; 1535 1536 default: 1537 return -EINVAL; 1538 } 1539 1540 return 0; 1541 } 1542 1543 static int si_common_sw_init(void *handle) 1544 { 1545 return 0; 1546 } 1547 1548 static int si_common_sw_fini(void *handle) 1549 { 1550 return 0; 1551 } 1552 1553 1554 static void si_init_golden_registers(struct amdgpu_device *adev) 1555 { 1556 switch (adev->asic_type) { 1557 case CHIP_TAHITI: 1558 amdgpu_device_program_register_sequence(adev, 1559 tahiti_golden_registers, 1560 ARRAY_SIZE(tahiti_golden_registers)); 1561 amdgpu_device_program_register_sequence(adev, 1562 tahiti_golden_rlc_registers, 1563 ARRAY_SIZE(tahiti_golden_rlc_registers)); 1564 amdgpu_device_program_register_sequence(adev, 1565 tahiti_mgcg_cgcg_init, 1566 ARRAY_SIZE(tahiti_mgcg_cgcg_init)); 1567 amdgpu_device_program_register_sequence(adev, 1568 tahiti_golden_registers2, 1569 ARRAY_SIZE(tahiti_golden_registers2)); 1570 break; 1571 case CHIP_PITCAIRN: 1572 amdgpu_device_program_register_sequence(adev, 1573 pitcairn_golden_registers, 1574 ARRAY_SIZE(pitcairn_golden_registers)); 1575 amdgpu_device_program_register_sequence(adev, 1576 pitcairn_golden_rlc_registers, 1577 ARRAY_SIZE(pitcairn_golden_rlc_registers)); 1578 amdgpu_device_program_register_sequence(adev, 1579 pitcairn_mgcg_cgcg_init, 1580 ARRAY_SIZE(pitcairn_mgcg_cgcg_init)); 1581 break; 1582 case CHIP_VERDE: 1583 amdgpu_device_program_register_sequence(adev, 1584 verde_golden_registers, 1585 ARRAY_SIZE(verde_golden_registers)); 1586 amdgpu_device_program_register_sequence(adev, 1587 verde_golden_rlc_registers, 1588 ARRAY_SIZE(verde_golden_rlc_registers)); 1589 amdgpu_device_program_register_sequence(adev, 1590 verde_mgcg_cgcg_init, 1591 ARRAY_SIZE(verde_mgcg_cgcg_init)); 1592 amdgpu_device_program_register_sequence(adev, 1593 verde_pg_init, 1594 ARRAY_SIZE(verde_pg_init)); 1595 break; 1596 case CHIP_OLAND: 1597 amdgpu_device_program_register_sequence(adev, 1598 oland_golden_registers, 1599 ARRAY_SIZE(oland_golden_registers)); 1600 amdgpu_device_program_register_sequence(adev, 1601 oland_golden_rlc_registers, 1602 ARRAY_SIZE(oland_golden_rlc_registers)); 1603 amdgpu_device_program_register_sequence(adev, 1604 oland_mgcg_cgcg_init, 1605 ARRAY_SIZE(oland_mgcg_cgcg_init)); 1606 break; 1607 case CHIP_HAINAN: 1608 amdgpu_device_program_register_sequence(adev, 1609 hainan_golden_registers, 1610 ARRAY_SIZE(hainan_golden_registers)); 1611 amdgpu_device_program_register_sequence(adev, 1612 hainan_golden_registers2, 1613 ARRAY_SIZE(hainan_golden_registers2)); 1614 amdgpu_device_program_register_sequence(adev, 1615 hainan_mgcg_cgcg_init, 1616 ARRAY_SIZE(hainan_mgcg_cgcg_init)); 1617 break; 1618 1619 1620 default: 1621 BUG(); 1622 } 1623 } 1624 1625 static void si_pcie_gen3_enable(struct amdgpu_device *adev) 1626 { 1627 struct pci_dev *root = adev->pdev->bus->self; 1628 int bridge_pos, gpu_pos; 1629 u32 speed_cntl, current_data_rate; 1630 int i; 1631 u16 tmp16; 1632 1633 if (pci_is_root_bus(adev->pdev->bus)) 1634 return; 1635 1636 if (amdgpu_pcie_gen2 == 0) 1637 return; 1638 1639 if (adev->flags & AMD_IS_APU) 1640 return; 1641 1642 if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | 1643 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3))) 1644 return; 1645 1646 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 1647 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >> 1648 LC_CURRENT_DATA_RATE_SHIFT; 1649 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { 1650 if (current_data_rate == 2) { 1651 DRM_INFO("PCIE gen 3 link speeds already enabled\n"); 1652 return; 1653 } 1654 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n"); 1655 } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) { 1656 if (current_data_rate == 1) { 1657 DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 1658 return; 1659 } 1660 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n"); 1661 } 1662 1663 bridge_pos = pci_pcie_cap(root); 1664 if (!bridge_pos) 1665 return; 1666 1667 gpu_pos = pci_pcie_cap(adev->pdev); 1668 if (!gpu_pos) 1669 return; 1670 1671 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { 1672 if (current_data_rate != 2) { 1673 u16 bridge_cfg, gpu_cfg; 1674 u16 bridge_cfg2, gpu_cfg2; 1675 u32 max_lw, current_lw, tmp; 1676 1677 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg); 1678 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg); 1679 1680 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD; 1681 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16); 1682 1683 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD; 1684 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16); 1685 1686 tmp = RREG32_PCIE(PCIE_LC_STATUS1); 1687 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT; 1688 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT; 1689 1690 if (current_lw < max_lw) { 1691 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 1692 if (tmp & LC_RENEGOTIATION_SUPPORT) { 1693 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS); 1694 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT); 1695 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW; 1696 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp); 1697 } 1698 } 1699 1700 for (i = 0; i < 10; i++) { 1701 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16); 1702 if (tmp16 & PCI_EXP_DEVSTA_TRPND) 1703 break; 1704 1705 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg); 1706 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg); 1707 1708 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2); 1709 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2); 1710 1711 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4); 1712 tmp |= LC_SET_QUIESCE; 1713 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp); 1714 1715 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4); 1716 tmp |= LC_REDO_EQ; 1717 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp); 1718 1719 mdelay(100); 1720 1721 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16); 1722 tmp16 &= ~PCI_EXP_LNKCTL_HAWD; 1723 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD); 1724 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16); 1725 1726 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16); 1727 tmp16 &= ~PCI_EXP_LNKCTL_HAWD; 1728 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD); 1729 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16); 1730 1731 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16); 1732 tmp16 &= ~((1 << 4) | (7 << 9)); 1733 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9))); 1734 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16); 1735 1736 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); 1737 tmp16 &= ~((1 << 4) | (7 << 9)); 1738 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9))); 1739 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16); 1740 1741 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4); 1742 tmp &= ~LC_SET_QUIESCE; 1743 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp); 1744 } 1745 } 1746 } 1747 1748 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE; 1749 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE; 1750 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 1751 1752 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); 1753 tmp16 &= ~0xf; 1754 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) 1755 tmp16 |= 3; 1756 else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) 1757 tmp16 |= 2; 1758 else 1759 tmp16 |= 1; 1760 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16); 1761 1762 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 1763 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE; 1764 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 1765 1766 for (i = 0; i < adev->usec_timeout; i++) { 1767 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 1768 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0) 1769 break; 1770 udelay(1); 1771 } 1772 } 1773 1774 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg) 1775 { 1776 unsigned long flags; 1777 u32 r; 1778 1779 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 1780 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 1781 r = RREG32(EVERGREEN_PIF_PHY0_DATA); 1782 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 1783 return r; 1784 } 1785 1786 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1787 { 1788 unsigned long flags; 1789 1790 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 1791 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 1792 WREG32(EVERGREEN_PIF_PHY0_DATA, (v)); 1793 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 1794 } 1795 1796 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg) 1797 { 1798 unsigned long flags; 1799 u32 r; 1800 1801 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 1802 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 1803 r = RREG32(EVERGREEN_PIF_PHY1_DATA); 1804 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 1805 return r; 1806 } 1807 1808 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1809 { 1810 unsigned long flags; 1811 1812 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 1813 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 1814 WREG32(EVERGREEN_PIF_PHY1_DATA, (v)); 1815 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 1816 } 1817 static void si_program_aspm(struct amdgpu_device *adev) 1818 { 1819 u32 data, orig; 1820 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false; 1821 bool disable_clkreq = false; 1822 1823 if (amdgpu_aspm == 0) 1824 return; 1825 1826 if (adev->flags & AMD_IS_APU) 1827 return; 1828 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL); 1829 data &= ~LC_XMIT_N_FTS_MASK; 1830 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN; 1831 if (orig != data) 1832 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data); 1833 1834 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3); 1835 data |= LC_GO_TO_RECOVERY; 1836 if (orig != data) 1837 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data); 1838 1839 orig = data = RREG32_PCIE(PCIE_P_CNTL); 1840 data |= P_IGNORE_EDB_ERR; 1841 if (orig != data) 1842 WREG32_PCIE(PCIE_P_CNTL, data); 1843 1844 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL); 1845 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK); 1846 data |= LC_PMI_TO_L1_DIS; 1847 if (!disable_l0s) 1848 data |= LC_L0S_INACTIVITY(7); 1849 1850 if (!disable_l1) { 1851 data |= LC_L1_INACTIVITY(7); 1852 data &= ~LC_PMI_TO_L1_DIS; 1853 if (orig != data) 1854 WREG32_PCIE_PORT(PCIE_LC_CNTL, data); 1855 1856 if (!disable_plloff_in_l1) { 1857 bool clk_req_support; 1858 1859 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0); 1860 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); 1861 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); 1862 if (orig != data) 1863 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data); 1864 1865 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1); 1866 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); 1867 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); 1868 if (orig != data) 1869 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data); 1870 1871 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0); 1872 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); 1873 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); 1874 if (orig != data) 1875 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data); 1876 1877 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1); 1878 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); 1879 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); 1880 if (orig != data) 1881 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data); 1882 1883 if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) { 1884 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0); 1885 data &= ~PLL_RAMP_UP_TIME_0_MASK; 1886 if (orig != data) 1887 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data); 1888 1889 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1); 1890 data &= ~PLL_RAMP_UP_TIME_1_MASK; 1891 if (orig != data) 1892 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data); 1893 1894 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2); 1895 data &= ~PLL_RAMP_UP_TIME_2_MASK; 1896 if (orig != data) 1897 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data); 1898 1899 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3); 1900 data &= ~PLL_RAMP_UP_TIME_3_MASK; 1901 if (orig != data) 1902 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data); 1903 1904 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0); 1905 data &= ~PLL_RAMP_UP_TIME_0_MASK; 1906 if (orig != data) 1907 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data); 1908 1909 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1); 1910 data &= ~PLL_RAMP_UP_TIME_1_MASK; 1911 if (orig != data) 1912 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data); 1913 1914 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2); 1915 data &= ~PLL_RAMP_UP_TIME_2_MASK; 1916 if (orig != data) 1917 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data); 1918 1919 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3); 1920 data &= ~PLL_RAMP_UP_TIME_3_MASK; 1921 if (orig != data) 1922 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data); 1923 } 1924 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 1925 data &= ~LC_DYN_LANES_PWR_STATE_MASK; 1926 data |= LC_DYN_LANES_PWR_STATE(3); 1927 if (orig != data) 1928 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data); 1929 1930 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL); 1931 data &= ~LS2_EXIT_TIME_MASK; 1932 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN)) 1933 data |= LS2_EXIT_TIME(5); 1934 if (orig != data) 1935 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data); 1936 1937 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL); 1938 data &= ~LS2_EXIT_TIME_MASK; 1939 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN)) 1940 data |= LS2_EXIT_TIME(5); 1941 if (orig != data) 1942 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data); 1943 1944 if (!disable_clkreq && 1945 !pci_is_root_bus(adev->pdev->bus)) { 1946 struct pci_dev *root = adev->pdev->bus->self; 1947 u32 lnkcap; 1948 1949 clk_req_support = false; 1950 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap); 1951 if (lnkcap & PCI_EXP_LNKCAP_CLKPM) 1952 clk_req_support = true; 1953 } else { 1954 clk_req_support = false; 1955 } 1956 1957 if (clk_req_support) { 1958 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2); 1959 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23; 1960 if (orig != data) 1961 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data); 1962 1963 orig = data = RREG32(THM_CLK_CNTL); 1964 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK); 1965 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1); 1966 if (orig != data) 1967 WREG32(THM_CLK_CNTL, data); 1968 1969 orig = data = RREG32(MISC_CLK_CNTL); 1970 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK); 1971 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1); 1972 if (orig != data) 1973 WREG32(MISC_CLK_CNTL, data); 1974 1975 orig = data = RREG32(CG_CLKPIN_CNTL); 1976 data &= ~BCLK_AS_XCLK; 1977 if (orig != data) 1978 WREG32(CG_CLKPIN_CNTL, data); 1979 1980 orig = data = RREG32(CG_CLKPIN_CNTL_2); 1981 data &= ~FORCE_BIF_REFCLK_EN; 1982 if (orig != data) 1983 WREG32(CG_CLKPIN_CNTL_2, data); 1984 1985 orig = data = RREG32(MPLL_BYPASSCLK_SEL); 1986 data &= ~MPLL_CLKOUT_SEL_MASK; 1987 data |= MPLL_CLKOUT_SEL(4); 1988 if (orig != data) 1989 WREG32(MPLL_BYPASSCLK_SEL, data); 1990 1991 orig = data = RREG32(SPLL_CNTL_MODE); 1992 data &= ~SPLL_REFCLK_SEL_MASK; 1993 if (orig != data) 1994 WREG32(SPLL_CNTL_MODE, data); 1995 } 1996 } 1997 } else { 1998 if (orig != data) 1999 WREG32_PCIE_PORT(PCIE_LC_CNTL, data); 2000 } 2001 2002 orig = data = RREG32_PCIE(PCIE_CNTL2); 2003 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN; 2004 if (orig != data) 2005 WREG32_PCIE(PCIE_CNTL2, data); 2006 2007 if (!disable_l0s) { 2008 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL); 2009 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) { 2010 data = RREG32_PCIE(PCIE_LC_STATUS1); 2011 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) { 2012 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL); 2013 data &= ~LC_L0S_INACTIVITY_MASK; 2014 if (orig != data) 2015 WREG32_PCIE_PORT(PCIE_LC_CNTL, data); 2016 } 2017 } 2018 } 2019 } 2020 2021 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev) 2022 { 2023 int readrq; 2024 u16 v; 2025 2026 readrq = pcie_get_readrq(adev->pdev); 2027 v = ffs(readrq) - 8; 2028 if ((v == 0) || (v == 6) || (v == 7)) 2029 pcie_set_readrq(adev->pdev, 512); 2030 } 2031 2032 static int si_common_hw_init(void *handle) 2033 { 2034 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2035 2036 si_fix_pci_max_read_req_size(adev); 2037 si_init_golden_registers(adev); 2038 si_pcie_gen3_enable(adev); 2039 si_program_aspm(adev); 2040 2041 return 0; 2042 } 2043 2044 static int si_common_hw_fini(void *handle) 2045 { 2046 return 0; 2047 } 2048 2049 static int si_common_suspend(void *handle) 2050 { 2051 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2052 2053 return si_common_hw_fini(adev); 2054 } 2055 2056 static int si_common_resume(void *handle) 2057 { 2058 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2059 2060 return si_common_hw_init(adev); 2061 } 2062 2063 static bool si_common_is_idle(void *handle) 2064 { 2065 return true; 2066 } 2067 2068 static int si_common_wait_for_idle(void *handle) 2069 { 2070 return 0; 2071 } 2072 2073 static int si_common_soft_reset(void *handle) 2074 { 2075 return 0; 2076 } 2077 2078 static int si_common_set_clockgating_state(void *handle, 2079 enum amd_clockgating_state state) 2080 { 2081 return 0; 2082 } 2083 2084 static int si_common_set_powergating_state(void *handle, 2085 enum amd_powergating_state state) 2086 { 2087 return 0; 2088 } 2089 2090 static const struct amd_ip_funcs si_common_ip_funcs = { 2091 .name = "si_common", 2092 .early_init = si_common_early_init, 2093 .late_init = NULL, 2094 .sw_init = si_common_sw_init, 2095 .sw_fini = si_common_sw_fini, 2096 .hw_init = si_common_hw_init, 2097 .hw_fini = si_common_hw_fini, 2098 .suspend = si_common_suspend, 2099 .resume = si_common_resume, 2100 .is_idle = si_common_is_idle, 2101 .wait_for_idle = si_common_wait_for_idle, 2102 .soft_reset = si_common_soft_reset, 2103 .set_clockgating_state = si_common_set_clockgating_state, 2104 .set_powergating_state = si_common_set_powergating_state, 2105 }; 2106 2107 static const struct amdgpu_ip_block_version si_common_ip_block = 2108 { 2109 .type = AMD_IP_BLOCK_TYPE_COMMON, 2110 .major = 1, 2111 .minor = 0, 2112 .rev = 0, 2113 .funcs = &si_common_ip_funcs, 2114 }; 2115 2116 int si_set_ip_blocks(struct amdgpu_device *adev) 2117 { 2118 si_detect_hw_virtualization(adev); 2119 2120 switch (adev->asic_type) { 2121 case CHIP_VERDE: 2122 case CHIP_TAHITI: 2123 case CHIP_PITCAIRN: 2124 amdgpu_device_ip_block_add(adev, &si_common_ip_block); 2125 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block); 2126 amdgpu_device_ip_block_add(adev, &si_ih_ip_block); 2127 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block); 2128 amdgpu_device_ip_block_add(adev, &si_dma_ip_block); 2129 amdgpu_device_ip_block_add(adev, &si_smu_ip_block); 2130 if (adev->enable_virtual_display) 2131 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2132 else 2133 amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block); 2134 /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */ 2135 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */ 2136 break; 2137 case CHIP_OLAND: 2138 amdgpu_device_ip_block_add(adev, &si_common_ip_block); 2139 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block); 2140 amdgpu_device_ip_block_add(adev, &si_ih_ip_block); 2141 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block); 2142 amdgpu_device_ip_block_add(adev, &si_dma_ip_block); 2143 amdgpu_device_ip_block_add(adev, &si_smu_ip_block); 2144 if (adev->enable_virtual_display) 2145 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2146 else 2147 amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block); 2148 2149 /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */ 2150 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */ 2151 break; 2152 case CHIP_HAINAN: 2153 amdgpu_device_ip_block_add(adev, &si_common_ip_block); 2154 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block); 2155 amdgpu_device_ip_block_add(adev, &si_ih_ip_block); 2156 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block); 2157 amdgpu_device_ip_block_add(adev, &si_dma_ip_block); 2158 amdgpu_device_ip_block_add(adev, &si_smu_ip_block); 2159 if (adev->enable_virtual_display) 2160 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2161 break; 2162 default: 2163 BUG(); 2164 } 2165 return 0; 2166 } 2167 2168