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