1 1.7 mrg /* $NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2012 Advanced Micro Devices, Inc. 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice shall be included in 14 1.1 riastrad * all copies or substantial portions of the Software. 15 1.1 riastrad * 16 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 23 1.1 riastrad * 24 1.1 riastrad * Authors: Alex Deucher 25 1.1 riastrad */ 26 1.1 riastrad #include <sys/cdefs.h> 27 1.7 mrg __KERNEL_RCSID(0, "$NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $"); 28 1.1 riastrad 29 1.1 riastrad #include <linux/firmware.h> 30 1.1 riastrad #include <linux/slab.h> 31 1.1 riastrad #include <linux/module.h> 32 1.4 riastrad #include <linux/pci.h> 33 1.4 riastrad 34 1.1 riastrad #include "amdgpu.h" 35 1.1 riastrad #include "amdgpu_atombios.h" 36 1.1 riastrad #include "amdgpu_ih.h" 37 1.1 riastrad #include "amdgpu_uvd.h" 38 1.1 riastrad #include "amdgpu_vce.h" 39 1.1 riastrad #include "cikd.h" 40 1.1 riastrad #include "atom.h" 41 1.4 riastrad #include "amd_pcie.h" 42 1.1 riastrad 43 1.1 riastrad #include "cik.h" 44 1.1 riastrad #include "gmc_v7_0.h" 45 1.1 riastrad #include "cik_ih.h" 46 1.1 riastrad #include "dce_v8_0.h" 47 1.1 riastrad #include "gfx_v7_0.h" 48 1.1 riastrad #include "cik_sdma.h" 49 1.1 riastrad #include "uvd_v4_2.h" 50 1.1 riastrad #include "vce_v2_0.h" 51 1.1 riastrad #include "cik_dpm.h" 52 1.1 riastrad 53 1.1 riastrad #include "uvd/uvd_4_2_d.h" 54 1.1 riastrad 55 1.1 riastrad #include "smu/smu_7_0_1_d.h" 56 1.1 riastrad #include "smu/smu_7_0_1_sh_mask.h" 57 1.1 riastrad 58 1.1 riastrad #include "dce/dce_8_0_d.h" 59 1.1 riastrad #include "dce/dce_8_0_sh_mask.h" 60 1.1 riastrad 61 1.1 riastrad #include "bif/bif_4_1_d.h" 62 1.1 riastrad #include "bif/bif_4_1_sh_mask.h" 63 1.1 riastrad 64 1.1 riastrad #include "gca/gfx_7_2_d.h" 65 1.1 riastrad #include "gca/gfx_7_2_enum.h" 66 1.1 riastrad #include "gca/gfx_7_2_sh_mask.h" 67 1.1 riastrad 68 1.1 riastrad #include "gmc/gmc_7_1_d.h" 69 1.1 riastrad #include "gmc/gmc_7_1_sh_mask.h" 70 1.1 riastrad 71 1.1 riastrad #include "oss/oss_2_0_d.h" 72 1.1 riastrad #include "oss/oss_2_0_sh_mask.h" 73 1.1 riastrad 74 1.4 riastrad #include "amdgpu_dm.h" 75 1.1 riastrad #include "amdgpu_amdkfd.h" 76 1.4 riastrad #include "dce_virtual.h" 77 1.1 riastrad 78 1.5 riastrad #include <linux/nbsd-namespace.h> 79 1.5 riastrad 80 1.1 riastrad /* 81 1.1 riastrad * Indirect registers accessor 82 1.1 riastrad */ 83 1.1 riastrad static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg) 84 1.1 riastrad { 85 1.1 riastrad unsigned long flags; 86 1.1 riastrad u32 r; 87 1.1 riastrad 88 1.1 riastrad spin_lock_irqsave(&adev->pcie_idx_lock, flags); 89 1.1 riastrad WREG32(mmPCIE_INDEX, reg); 90 1.1 riastrad (void)RREG32(mmPCIE_INDEX); 91 1.1 riastrad r = RREG32(mmPCIE_DATA); 92 1.1 riastrad spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 93 1.1 riastrad return r; 94 1.1 riastrad } 95 1.1 riastrad 96 1.1 riastrad static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 97 1.1 riastrad { 98 1.1 riastrad unsigned long flags; 99 1.1 riastrad 100 1.1 riastrad spin_lock_irqsave(&adev->pcie_idx_lock, flags); 101 1.1 riastrad WREG32(mmPCIE_INDEX, reg); 102 1.1 riastrad (void)RREG32(mmPCIE_INDEX); 103 1.1 riastrad WREG32(mmPCIE_DATA, v); 104 1.1 riastrad (void)RREG32(mmPCIE_DATA); 105 1.1 riastrad spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 106 1.1 riastrad } 107 1.1 riastrad 108 1.1 riastrad static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg) 109 1.1 riastrad { 110 1.1 riastrad unsigned long flags; 111 1.1 riastrad u32 r; 112 1.1 riastrad 113 1.1 riastrad spin_lock_irqsave(&adev->smc_idx_lock, flags); 114 1.1 riastrad WREG32(mmSMC_IND_INDEX_0, (reg)); 115 1.1 riastrad r = RREG32(mmSMC_IND_DATA_0); 116 1.1 riastrad spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 117 1.1 riastrad return r; 118 1.1 riastrad } 119 1.1 riastrad 120 1.1 riastrad static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 121 1.1 riastrad { 122 1.1 riastrad unsigned long flags; 123 1.1 riastrad 124 1.1 riastrad spin_lock_irqsave(&adev->smc_idx_lock, flags); 125 1.1 riastrad WREG32(mmSMC_IND_INDEX_0, (reg)); 126 1.1 riastrad WREG32(mmSMC_IND_DATA_0, (v)); 127 1.1 riastrad spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 128 1.1 riastrad } 129 1.1 riastrad 130 1.1 riastrad static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg) 131 1.1 riastrad { 132 1.1 riastrad unsigned long flags; 133 1.1 riastrad u32 r; 134 1.1 riastrad 135 1.1 riastrad spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags); 136 1.1 riastrad WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff)); 137 1.1 riastrad r = RREG32(mmUVD_CTX_DATA); 138 1.1 riastrad spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags); 139 1.1 riastrad return r; 140 1.1 riastrad } 141 1.1 riastrad 142 1.1 riastrad static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 143 1.1 riastrad { 144 1.1 riastrad unsigned long flags; 145 1.1 riastrad 146 1.1 riastrad spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags); 147 1.1 riastrad WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff)); 148 1.1 riastrad WREG32(mmUVD_CTX_DATA, (v)); 149 1.1 riastrad spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags); 150 1.1 riastrad } 151 1.1 riastrad 152 1.1 riastrad static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg) 153 1.1 riastrad { 154 1.1 riastrad unsigned long flags; 155 1.1 riastrad u32 r; 156 1.1 riastrad 157 1.1 riastrad spin_lock_irqsave(&adev->didt_idx_lock, flags); 158 1.1 riastrad WREG32(mmDIDT_IND_INDEX, (reg)); 159 1.1 riastrad r = RREG32(mmDIDT_IND_DATA); 160 1.1 riastrad spin_unlock_irqrestore(&adev->didt_idx_lock, flags); 161 1.1 riastrad return r; 162 1.1 riastrad } 163 1.1 riastrad 164 1.1 riastrad static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 165 1.1 riastrad { 166 1.1 riastrad unsigned long flags; 167 1.1 riastrad 168 1.1 riastrad spin_lock_irqsave(&adev->didt_idx_lock, flags); 169 1.1 riastrad WREG32(mmDIDT_IND_INDEX, (reg)); 170 1.1 riastrad WREG32(mmDIDT_IND_DATA, (v)); 171 1.1 riastrad spin_unlock_irqrestore(&adev->didt_idx_lock, flags); 172 1.1 riastrad } 173 1.1 riastrad 174 1.1 riastrad static const u32 bonaire_golden_spm_registers[] = 175 1.1 riastrad { 176 1.1 riastrad 0xc200, 0xe0ffffff, 0xe0000000 177 1.1 riastrad }; 178 1.1 riastrad 179 1.1 riastrad static const u32 bonaire_golden_common_registers[] = 180 1.1 riastrad { 181 1.1 riastrad 0x31dc, 0xffffffff, 0x00000800, 182 1.1 riastrad 0x31dd, 0xffffffff, 0x00000800, 183 1.1 riastrad 0x31e6, 0xffffffff, 0x00007fbf, 184 1.1 riastrad 0x31e7, 0xffffffff, 0x00007faf 185 1.1 riastrad }; 186 1.1 riastrad 187 1.1 riastrad static const u32 bonaire_golden_registers[] = 188 1.1 riastrad { 189 1.1 riastrad 0xcd5, 0x00000333, 0x00000333, 190 1.1 riastrad 0xcd4, 0x000c0fc0, 0x00040200, 191 1.1 riastrad 0x2684, 0x00010000, 0x00058208, 192 1.1 riastrad 0xf000, 0xffff1fff, 0x00140000, 193 1.1 riastrad 0xf080, 0xfdfc0fff, 0x00000100, 194 1.1 riastrad 0xf08d, 0x40000000, 0x40000200, 195 1.1 riastrad 0x260c, 0xffffffff, 0x00000000, 196 1.1 riastrad 0x260d, 0xf00fffff, 0x00000400, 197 1.1 riastrad 0x260e, 0x0002021c, 0x00020200, 198 1.1 riastrad 0x31e, 0x00000080, 0x00000000, 199 1.1 riastrad 0x16ec, 0x000000f0, 0x00000070, 200 1.1 riastrad 0x16f0, 0xf0311fff, 0x80300000, 201 1.1 riastrad 0x263e, 0x73773777, 0x12010001, 202 1.1 riastrad 0xd43, 0x00810000, 0x408af000, 203 1.1 riastrad 0x1c0c, 0x31000111, 0x00000011, 204 1.1 riastrad 0xbd2, 0x73773777, 0x12010001, 205 1.1 riastrad 0x883, 0x00007fb6, 0x0021a1b1, 206 1.1 riastrad 0x884, 0x00007fb6, 0x002021b1, 207 1.1 riastrad 0x860, 0x00007fb6, 0x00002191, 208 1.1 riastrad 0x886, 0x00007fb6, 0x002121b1, 209 1.1 riastrad 0x887, 0x00007fb6, 0x002021b1, 210 1.1 riastrad 0x877, 0x00007fb6, 0x00002191, 211 1.1 riastrad 0x878, 0x00007fb6, 0x00002191, 212 1.1 riastrad 0xd8a, 0x0000003f, 0x0000000a, 213 1.1 riastrad 0xd8b, 0x0000003f, 0x0000000a, 214 1.1 riastrad 0xab9, 0x00073ffe, 0x000022a2, 215 1.1 riastrad 0x903, 0x000007ff, 0x00000000, 216 1.1 riastrad 0x2285, 0xf000003f, 0x00000007, 217 1.1 riastrad 0x22fc, 0x00002001, 0x00000001, 218 1.1 riastrad 0x22c9, 0xffffffff, 0x00ffffff, 219 1.1 riastrad 0xc281, 0x0000ff0f, 0x00000000, 220 1.1 riastrad 0xa293, 0x07ffffff, 0x06000000, 221 1.1 riastrad 0x136, 0x00000fff, 0x00000100, 222 1.1 riastrad 0xf9e, 0x00000001, 0x00000002, 223 1.1 riastrad 0x2440, 0x03000000, 0x0362c688, 224 1.1 riastrad 0x2300, 0x000000ff, 0x00000001, 225 1.1 riastrad 0x390, 0x00001fff, 0x00001fff, 226 1.1 riastrad 0x2418, 0x0000007f, 0x00000020, 227 1.1 riastrad 0x2542, 0x00010000, 0x00010000, 228 1.1 riastrad 0x2b05, 0x000003ff, 0x000000f3, 229 1.1 riastrad 0x2b03, 0xffffffff, 0x00001032 230 1.1 riastrad }; 231 1.1 riastrad 232 1.1 riastrad static const u32 bonaire_mgcg_cgcg_init[] = 233 1.1 riastrad { 234 1.1 riastrad 0x3108, 0xffffffff, 0xfffffffc, 235 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 236 1.1 riastrad 0xf0a8, 0xffffffff, 0x00000100, 237 1.1 riastrad 0xf082, 0xffffffff, 0x00000100, 238 1.1 riastrad 0xf0b0, 0xffffffff, 0xc0000100, 239 1.1 riastrad 0xf0b2, 0xffffffff, 0xc0000100, 240 1.1 riastrad 0xf0b1, 0xffffffff, 0xc0000100, 241 1.1 riastrad 0x1579, 0xffffffff, 0x00600100, 242 1.1 riastrad 0xf0a0, 0xffffffff, 0x00000100, 243 1.1 riastrad 0xf085, 0xffffffff, 0x06000100, 244 1.1 riastrad 0xf088, 0xffffffff, 0x00000100, 245 1.1 riastrad 0xf086, 0xffffffff, 0x06000100, 246 1.1 riastrad 0xf081, 0xffffffff, 0x00000100, 247 1.1 riastrad 0xf0b8, 0xffffffff, 0x00000100, 248 1.1 riastrad 0xf089, 0xffffffff, 0x00000100, 249 1.1 riastrad 0xf080, 0xffffffff, 0x00000100, 250 1.1 riastrad 0xf08c, 0xffffffff, 0x00000100, 251 1.1 riastrad 0xf08d, 0xffffffff, 0x00000100, 252 1.1 riastrad 0xf094, 0xffffffff, 0x00000100, 253 1.1 riastrad 0xf095, 0xffffffff, 0x00000100, 254 1.1 riastrad 0xf096, 0xffffffff, 0x00000100, 255 1.1 riastrad 0xf097, 0xffffffff, 0x00000100, 256 1.1 riastrad 0xf098, 0xffffffff, 0x00000100, 257 1.1 riastrad 0xf09f, 0xffffffff, 0x00000100, 258 1.1 riastrad 0xf09e, 0xffffffff, 0x00000100, 259 1.1 riastrad 0xf084, 0xffffffff, 0x06000100, 260 1.1 riastrad 0xf0a4, 0xffffffff, 0x00000100, 261 1.1 riastrad 0xf09d, 0xffffffff, 0x00000100, 262 1.1 riastrad 0xf0ad, 0xffffffff, 0x00000100, 263 1.1 riastrad 0xf0ac, 0xffffffff, 0x00000100, 264 1.1 riastrad 0xf09c, 0xffffffff, 0x00000100, 265 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 266 1.1 riastrad 0xf008, 0xffffffff, 0x00010000, 267 1.1 riastrad 0xf009, 0xffffffff, 0x00030002, 268 1.1 riastrad 0xf00a, 0xffffffff, 0x00040007, 269 1.1 riastrad 0xf00b, 0xffffffff, 0x00060005, 270 1.1 riastrad 0xf00c, 0xffffffff, 0x00090008, 271 1.1 riastrad 0xf00d, 0xffffffff, 0x00010000, 272 1.1 riastrad 0xf00e, 0xffffffff, 0x00030002, 273 1.1 riastrad 0xf00f, 0xffffffff, 0x00040007, 274 1.1 riastrad 0xf010, 0xffffffff, 0x00060005, 275 1.1 riastrad 0xf011, 0xffffffff, 0x00090008, 276 1.1 riastrad 0xf012, 0xffffffff, 0x00010000, 277 1.1 riastrad 0xf013, 0xffffffff, 0x00030002, 278 1.1 riastrad 0xf014, 0xffffffff, 0x00040007, 279 1.1 riastrad 0xf015, 0xffffffff, 0x00060005, 280 1.1 riastrad 0xf016, 0xffffffff, 0x00090008, 281 1.1 riastrad 0xf017, 0xffffffff, 0x00010000, 282 1.1 riastrad 0xf018, 0xffffffff, 0x00030002, 283 1.1 riastrad 0xf019, 0xffffffff, 0x00040007, 284 1.1 riastrad 0xf01a, 0xffffffff, 0x00060005, 285 1.1 riastrad 0xf01b, 0xffffffff, 0x00090008, 286 1.1 riastrad 0xf01c, 0xffffffff, 0x00010000, 287 1.1 riastrad 0xf01d, 0xffffffff, 0x00030002, 288 1.1 riastrad 0xf01e, 0xffffffff, 0x00040007, 289 1.1 riastrad 0xf01f, 0xffffffff, 0x00060005, 290 1.1 riastrad 0xf020, 0xffffffff, 0x00090008, 291 1.1 riastrad 0xf021, 0xffffffff, 0x00010000, 292 1.1 riastrad 0xf022, 0xffffffff, 0x00030002, 293 1.1 riastrad 0xf023, 0xffffffff, 0x00040007, 294 1.1 riastrad 0xf024, 0xffffffff, 0x00060005, 295 1.1 riastrad 0xf025, 0xffffffff, 0x00090008, 296 1.1 riastrad 0xf026, 0xffffffff, 0x00010000, 297 1.1 riastrad 0xf027, 0xffffffff, 0x00030002, 298 1.1 riastrad 0xf028, 0xffffffff, 0x00040007, 299 1.1 riastrad 0xf029, 0xffffffff, 0x00060005, 300 1.1 riastrad 0xf02a, 0xffffffff, 0x00090008, 301 1.1 riastrad 0xf000, 0xffffffff, 0x96e00200, 302 1.1 riastrad 0x21c2, 0xffffffff, 0x00900100, 303 1.1 riastrad 0x3109, 0xffffffff, 0x0020003f, 304 1.1 riastrad 0xe, 0xffffffff, 0x0140001c, 305 1.1 riastrad 0xf, 0x000f0000, 0x000f0000, 306 1.1 riastrad 0x88, 0xffffffff, 0xc060000c, 307 1.1 riastrad 0x89, 0xc0000fff, 0x00000100, 308 1.1 riastrad 0x3e4, 0xffffffff, 0x00000100, 309 1.1 riastrad 0x3e6, 0x00000101, 0x00000000, 310 1.1 riastrad 0x82a, 0xffffffff, 0x00000104, 311 1.1 riastrad 0x1579, 0xff000fff, 0x00000100, 312 1.1 riastrad 0xc33, 0xc0000fff, 0x00000104, 313 1.1 riastrad 0x3079, 0x00000001, 0x00000001, 314 1.1 riastrad 0x3403, 0xff000ff0, 0x00000100, 315 1.1 riastrad 0x3603, 0xff000ff0, 0x00000100 316 1.1 riastrad }; 317 1.1 riastrad 318 1.1 riastrad static const u32 spectre_golden_spm_registers[] = 319 1.1 riastrad { 320 1.1 riastrad 0xc200, 0xe0ffffff, 0xe0000000 321 1.1 riastrad }; 322 1.1 riastrad 323 1.1 riastrad static const u32 spectre_golden_common_registers[] = 324 1.1 riastrad { 325 1.1 riastrad 0x31dc, 0xffffffff, 0x00000800, 326 1.1 riastrad 0x31dd, 0xffffffff, 0x00000800, 327 1.1 riastrad 0x31e6, 0xffffffff, 0x00007fbf, 328 1.1 riastrad 0x31e7, 0xffffffff, 0x00007faf 329 1.1 riastrad }; 330 1.1 riastrad 331 1.1 riastrad static const u32 spectre_golden_registers[] = 332 1.1 riastrad { 333 1.1 riastrad 0xf000, 0xffff1fff, 0x96940200, 334 1.1 riastrad 0xf003, 0xffff0001, 0xff000000, 335 1.1 riastrad 0xf080, 0xfffc0fff, 0x00000100, 336 1.1 riastrad 0x1bb6, 0x00010101, 0x00010000, 337 1.1 riastrad 0x260d, 0xf00fffff, 0x00000400, 338 1.1 riastrad 0x260e, 0xfffffffc, 0x00020200, 339 1.1 riastrad 0x16ec, 0x000000f0, 0x00000070, 340 1.1 riastrad 0x16f0, 0xf0311fff, 0x80300000, 341 1.1 riastrad 0x263e, 0x73773777, 0x12010001, 342 1.1 riastrad 0x26df, 0x00ff0000, 0x00fc0000, 343 1.1 riastrad 0xbd2, 0x73773777, 0x12010001, 344 1.1 riastrad 0x2285, 0xf000003f, 0x00000007, 345 1.1 riastrad 0x22c9, 0xffffffff, 0x00ffffff, 346 1.1 riastrad 0xa0d4, 0x3f3f3fff, 0x00000082, 347 1.1 riastrad 0xa0d5, 0x0000003f, 0x00000000, 348 1.1 riastrad 0xf9e, 0x00000001, 0x00000002, 349 1.1 riastrad 0x244f, 0xffff03df, 0x00000004, 350 1.1 riastrad 0x31da, 0x00000008, 0x00000008, 351 1.1 riastrad 0x2300, 0x000008ff, 0x00000800, 352 1.1 riastrad 0x2542, 0x00010000, 0x00010000, 353 1.1 riastrad 0x2b03, 0xffffffff, 0x54763210, 354 1.1 riastrad 0x853e, 0x01ff01ff, 0x00000002, 355 1.1 riastrad 0x8526, 0x007ff800, 0x00200000, 356 1.1 riastrad 0x8057, 0xffffffff, 0x00000f40, 357 1.1 riastrad 0xc24d, 0xffffffff, 0x00000001 358 1.1 riastrad }; 359 1.1 riastrad 360 1.1 riastrad static const u32 spectre_mgcg_cgcg_init[] = 361 1.1 riastrad { 362 1.1 riastrad 0x3108, 0xffffffff, 0xfffffffc, 363 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 364 1.1 riastrad 0xf0a8, 0xffffffff, 0x00000100, 365 1.1 riastrad 0xf082, 0xffffffff, 0x00000100, 366 1.1 riastrad 0xf0b0, 0xffffffff, 0x00000100, 367 1.1 riastrad 0xf0b2, 0xffffffff, 0x00000100, 368 1.1 riastrad 0xf0b1, 0xffffffff, 0x00000100, 369 1.1 riastrad 0x1579, 0xffffffff, 0x00600100, 370 1.1 riastrad 0xf0a0, 0xffffffff, 0x00000100, 371 1.1 riastrad 0xf085, 0xffffffff, 0x06000100, 372 1.1 riastrad 0xf088, 0xffffffff, 0x00000100, 373 1.1 riastrad 0xf086, 0xffffffff, 0x06000100, 374 1.1 riastrad 0xf081, 0xffffffff, 0x00000100, 375 1.1 riastrad 0xf0b8, 0xffffffff, 0x00000100, 376 1.1 riastrad 0xf089, 0xffffffff, 0x00000100, 377 1.1 riastrad 0xf080, 0xffffffff, 0x00000100, 378 1.1 riastrad 0xf08c, 0xffffffff, 0x00000100, 379 1.1 riastrad 0xf08d, 0xffffffff, 0x00000100, 380 1.1 riastrad 0xf094, 0xffffffff, 0x00000100, 381 1.1 riastrad 0xf095, 0xffffffff, 0x00000100, 382 1.1 riastrad 0xf096, 0xffffffff, 0x00000100, 383 1.1 riastrad 0xf097, 0xffffffff, 0x00000100, 384 1.1 riastrad 0xf098, 0xffffffff, 0x00000100, 385 1.1 riastrad 0xf09f, 0xffffffff, 0x00000100, 386 1.1 riastrad 0xf09e, 0xffffffff, 0x00000100, 387 1.1 riastrad 0xf084, 0xffffffff, 0x06000100, 388 1.1 riastrad 0xf0a4, 0xffffffff, 0x00000100, 389 1.1 riastrad 0xf09d, 0xffffffff, 0x00000100, 390 1.1 riastrad 0xf0ad, 0xffffffff, 0x00000100, 391 1.1 riastrad 0xf0ac, 0xffffffff, 0x00000100, 392 1.1 riastrad 0xf09c, 0xffffffff, 0x00000100, 393 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 394 1.1 riastrad 0xf008, 0xffffffff, 0x00010000, 395 1.1 riastrad 0xf009, 0xffffffff, 0x00030002, 396 1.1 riastrad 0xf00a, 0xffffffff, 0x00040007, 397 1.1 riastrad 0xf00b, 0xffffffff, 0x00060005, 398 1.1 riastrad 0xf00c, 0xffffffff, 0x00090008, 399 1.1 riastrad 0xf00d, 0xffffffff, 0x00010000, 400 1.1 riastrad 0xf00e, 0xffffffff, 0x00030002, 401 1.1 riastrad 0xf00f, 0xffffffff, 0x00040007, 402 1.1 riastrad 0xf010, 0xffffffff, 0x00060005, 403 1.1 riastrad 0xf011, 0xffffffff, 0x00090008, 404 1.1 riastrad 0xf012, 0xffffffff, 0x00010000, 405 1.1 riastrad 0xf013, 0xffffffff, 0x00030002, 406 1.1 riastrad 0xf014, 0xffffffff, 0x00040007, 407 1.1 riastrad 0xf015, 0xffffffff, 0x00060005, 408 1.1 riastrad 0xf016, 0xffffffff, 0x00090008, 409 1.1 riastrad 0xf017, 0xffffffff, 0x00010000, 410 1.1 riastrad 0xf018, 0xffffffff, 0x00030002, 411 1.1 riastrad 0xf019, 0xffffffff, 0x00040007, 412 1.1 riastrad 0xf01a, 0xffffffff, 0x00060005, 413 1.1 riastrad 0xf01b, 0xffffffff, 0x00090008, 414 1.1 riastrad 0xf01c, 0xffffffff, 0x00010000, 415 1.1 riastrad 0xf01d, 0xffffffff, 0x00030002, 416 1.1 riastrad 0xf01e, 0xffffffff, 0x00040007, 417 1.1 riastrad 0xf01f, 0xffffffff, 0x00060005, 418 1.1 riastrad 0xf020, 0xffffffff, 0x00090008, 419 1.1 riastrad 0xf021, 0xffffffff, 0x00010000, 420 1.1 riastrad 0xf022, 0xffffffff, 0x00030002, 421 1.1 riastrad 0xf023, 0xffffffff, 0x00040007, 422 1.1 riastrad 0xf024, 0xffffffff, 0x00060005, 423 1.1 riastrad 0xf025, 0xffffffff, 0x00090008, 424 1.1 riastrad 0xf026, 0xffffffff, 0x00010000, 425 1.1 riastrad 0xf027, 0xffffffff, 0x00030002, 426 1.1 riastrad 0xf028, 0xffffffff, 0x00040007, 427 1.1 riastrad 0xf029, 0xffffffff, 0x00060005, 428 1.1 riastrad 0xf02a, 0xffffffff, 0x00090008, 429 1.1 riastrad 0xf02b, 0xffffffff, 0x00010000, 430 1.1 riastrad 0xf02c, 0xffffffff, 0x00030002, 431 1.1 riastrad 0xf02d, 0xffffffff, 0x00040007, 432 1.1 riastrad 0xf02e, 0xffffffff, 0x00060005, 433 1.1 riastrad 0xf02f, 0xffffffff, 0x00090008, 434 1.1 riastrad 0xf000, 0xffffffff, 0x96e00200, 435 1.1 riastrad 0x21c2, 0xffffffff, 0x00900100, 436 1.1 riastrad 0x3109, 0xffffffff, 0x0020003f, 437 1.1 riastrad 0xe, 0xffffffff, 0x0140001c, 438 1.1 riastrad 0xf, 0x000f0000, 0x000f0000, 439 1.1 riastrad 0x88, 0xffffffff, 0xc060000c, 440 1.1 riastrad 0x89, 0xc0000fff, 0x00000100, 441 1.1 riastrad 0x3e4, 0xffffffff, 0x00000100, 442 1.1 riastrad 0x3e6, 0x00000101, 0x00000000, 443 1.1 riastrad 0x82a, 0xffffffff, 0x00000104, 444 1.1 riastrad 0x1579, 0xff000fff, 0x00000100, 445 1.1 riastrad 0xc33, 0xc0000fff, 0x00000104, 446 1.1 riastrad 0x3079, 0x00000001, 0x00000001, 447 1.1 riastrad 0x3403, 0xff000ff0, 0x00000100, 448 1.1 riastrad 0x3603, 0xff000ff0, 0x00000100 449 1.1 riastrad }; 450 1.1 riastrad 451 1.1 riastrad static const u32 kalindi_golden_spm_registers[] = 452 1.1 riastrad { 453 1.1 riastrad 0xc200, 0xe0ffffff, 0xe0000000 454 1.1 riastrad }; 455 1.1 riastrad 456 1.1 riastrad static const u32 kalindi_golden_common_registers[] = 457 1.1 riastrad { 458 1.1 riastrad 0x31dc, 0xffffffff, 0x00000800, 459 1.1 riastrad 0x31dd, 0xffffffff, 0x00000800, 460 1.1 riastrad 0x31e6, 0xffffffff, 0x00007fbf, 461 1.1 riastrad 0x31e7, 0xffffffff, 0x00007faf 462 1.1 riastrad }; 463 1.1 riastrad 464 1.1 riastrad static const u32 kalindi_golden_registers[] = 465 1.1 riastrad { 466 1.1 riastrad 0xf000, 0xffffdfff, 0x6e944040, 467 1.1 riastrad 0x1579, 0xff607fff, 0xfc000100, 468 1.1 riastrad 0xf088, 0xff000fff, 0x00000100, 469 1.1 riastrad 0xf089, 0xff000fff, 0x00000100, 470 1.1 riastrad 0xf080, 0xfffc0fff, 0x00000100, 471 1.1 riastrad 0x1bb6, 0x00010101, 0x00010000, 472 1.1 riastrad 0x260c, 0xffffffff, 0x00000000, 473 1.1 riastrad 0x260d, 0xf00fffff, 0x00000400, 474 1.1 riastrad 0x16ec, 0x000000f0, 0x00000070, 475 1.1 riastrad 0x16f0, 0xf0311fff, 0x80300000, 476 1.1 riastrad 0x263e, 0x73773777, 0x12010001, 477 1.1 riastrad 0x263f, 0xffffffff, 0x00000010, 478 1.1 riastrad 0x26df, 0x00ff0000, 0x00fc0000, 479 1.1 riastrad 0x200c, 0x00001f0f, 0x0000100a, 480 1.1 riastrad 0xbd2, 0x73773777, 0x12010001, 481 1.1 riastrad 0x902, 0x000fffff, 0x000c007f, 482 1.1 riastrad 0x2285, 0xf000003f, 0x00000007, 483 1.1 riastrad 0x22c9, 0x3fff3fff, 0x00ffcfff, 484 1.1 riastrad 0xc281, 0x0000ff0f, 0x00000000, 485 1.1 riastrad 0xa293, 0x07ffffff, 0x06000000, 486 1.1 riastrad 0x136, 0x00000fff, 0x00000100, 487 1.1 riastrad 0xf9e, 0x00000001, 0x00000002, 488 1.1 riastrad 0x31da, 0x00000008, 0x00000008, 489 1.1 riastrad 0x2300, 0x000000ff, 0x00000003, 490 1.1 riastrad 0x853e, 0x01ff01ff, 0x00000002, 491 1.1 riastrad 0x8526, 0x007ff800, 0x00200000, 492 1.1 riastrad 0x8057, 0xffffffff, 0x00000f40, 493 1.1 riastrad 0x2231, 0x001f3ae3, 0x00000082, 494 1.1 riastrad 0x2235, 0x0000001f, 0x00000010, 495 1.1 riastrad 0xc24d, 0xffffffff, 0x00000000 496 1.1 riastrad }; 497 1.1 riastrad 498 1.1 riastrad static const u32 kalindi_mgcg_cgcg_init[] = 499 1.1 riastrad { 500 1.1 riastrad 0x3108, 0xffffffff, 0xfffffffc, 501 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 502 1.1 riastrad 0xf0a8, 0xffffffff, 0x00000100, 503 1.1 riastrad 0xf082, 0xffffffff, 0x00000100, 504 1.1 riastrad 0xf0b0, 0xffffffff, 0x00000100, 505 1.1 riastrad 0xf0b2, 0xffffffff, 0x00000100, 506 1.1 riastrad 0xf0b1, 0xffffffff, 0x00000100, 507 1.1 riastrad 0x1579, 0xffffffff, 0x00600100, 508 1.1 riastrad 0xf0a0, 0xffffffff, 0x00000100, 509 1.1 riastrad 0xf085, 0xffffffff, 0x06000100, 510 1.1 riastrad 0xf088, 0xffffffff, 0x00000100, 511 1.1 riastrad 0xf086, 0xffffffff, 0x06000100, 512 1.1 riastrad 0xf081, 0xffffffff, 0x00000100, 513 1.1 riastrad 0xf0b8, 0xffffffff, 0x00000100, 514 1.1 riastrad 0xf089, 0xffffffff, 0x00000100, 515 1.1 riastrad 0xf080, 0xffffffff, 0x00000100, 516 1.1 riastrad 0xf08c, 0xffffffff, 0x00000100, 517 1.1 riastrad 0xf08d, 0xffffffff, 0x00000100, 518 1.1 riastrad 0xf094, 0xffffffff, 0x00000100, 519 1.1 riastrad 0xf095, 0xffffffff, 0x00000100, 520 1.1 riastrad 0xf096, 0xffffffff, 0x00000100, 521 1.1 riastrad 0xf097, 0xffffffff, 0x00000100, 522 1.1 riastrad 0xf098, 0xffffffff, 0x00000100, 523 1.1 riastrad 0xf09f, 0xffffffff, 0x00000100, 524 1.1 riastrad 0xf09e, 0xffffffff, 0x00000100, 525 1.1 riastrad 0xf084, 0xffffffff, 0x06000100, 526 1.1 riastrad 0xf0a4, 0xffffffff, 0x00000100, 527 1.1 riastrad 0xf09d, 0xffffffff, 0x00000100, 528 1.1 riastrad 0xf0ad, 0xffffffff, 0x00000100, 529 1.1 riastrad 0xf0ac, 0xffffffff, 0x00000100, 530 1.1 riastrad 0xf09c, 0xffffffff, 0x00000100, 531 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 532 1.1 riastrad 0xf008, 0xffffffff, 0x00010000, 533 1.1 riastrad 0xf009, 0xffffffff, 0x00030002, 534 1.1 riastrad 0xf00a, 0xffffffff, 0x00040007, 535 1.1 riastrad 0xf00b, 0xffffffff, 0x00060005, 536 1.1 riastrad 0xf00c, 0xffffffff, 0x00090008, 537 1.1 riastrad 0xf00d, 0xffffffff, 0x00010000, 538 1.1 riastrad 0xf00e, 0xffffffff, 0x00030002, 539 1.1 riastrad 0xf00f, 0xffffffff, 0x00040007, 540 1.1 riastrad 0xf010, 0xffffffff, 0x00060005, 541 1.1 riastrad 0xf011, 0xffffffff, 0x00090008, 542 1.1 riastrad 0xf000, 0xffffffff, 0x96e00200, 543 1.1 riastrad 0x21c2, 0xffffffff, 0x00900100, 544 1.1 riastrad 0x3109, 0xffffffff, 0x0020003f, 545 1.1 riastrad 0xe, 0xffffffff, 0x0140001c, 546 1.1 riastrad 0xf, 0x000f0000, 0x000f0000, 547 1.1 riastrad 0x88, 0xffffffff, 0xc060000c, 548 1.1 riastrad 0x89, 0xc0000fff, 0x00000100, 549 1.1 riastrad 0x82a, 0xffffffff, 0x00000104, 550 1.1 riastrad 0x1579, 0xff000fff, 0x00000100, 551 1.1 riastrad 0xc33, 0xc0000fff, 0x00000104, 552 1.1 riastrad 0x3079, 0x00000001, 0x00000001, 553 1.1 riastrad 0x3403, 0xff000ff0, 0x00000100, 554 1.1 riastrad 0x3603, 0xff000ff0, 0x00000100 555 1.1 riastrad }; 556 1.1 riastrad 557 1.1 riastrad static const u32 hawaii_golden_spm_registers[] = 558 1.1 riastrad { 559 1.1 riastrad 0xc200, 0xe0ffffff, 0xe0000000 560 1.1 riastrad }; 561 1.1 riastrad 562 1.1 riastrad static const u32 hawaii_golden_common_registers[] = 563 1.1 riastrad { 564 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 565 1.1 riastrad 0xa0d4, 0xffffffff, 0x3a00161a, 566 1.1 riastrad 0xa0d5, 0xffffffff, 0x0000002e, 567 1.1 riastrad 0x2684, 0xffffffff, 0x00018208, 568 1.1 riastrad 0x263e, 0xffffffff, 0x12011003 569 1.1 riastrad }; 570 1.1 riastrad 571 1.1 riastrad static const u32 hawaii_golden_registers[] = 572 1.1 riastrad { 573 1.1 riastrad 0xcd5, 0x00000333, 0x00000333, 574 1.1 riastrad 0x2684, 0x00010000, 0x00058208, 575 1.1 riastrad 0x260c, 0xffffffff, 0x00000000, 576 1.1 riastrad 0x260d, 0xf00fffff, 0x00000400, 577 1.1 riastrad 0x260e, 0x0002021c, 0x00020200, 578 1.1 riastrad 0x31e, 0x00000080, 0x00000000, 579 1.1 riastrad 0x16ec, 0x000000f0, 0x00000070, 580 1.1 riastrad 0x16f0, 0xf0311fff, 0x80300000, 581 1.1 riastrad 0xd43, 0x00810000, 0x408af000, 582 1.1 riastrad 0x1c0c, 0x31000111, 0x00000011, 583 1.1 riastrad 0xbd2, 0x73773777, 0x12010001, 584 1.1 riastrad 0x848, 0x0000007f, 0x0000001b, 585 1.1 riastrad 0x877, 0x00007fb6, 0x00002191, 586 1.1 riastrad 0xd8a, 0x0000003f, 0x0000000a, 587 1.1 riastrad 0xd8b, 0x0000003f, 0x0000000a, 588 1.1 riastrad 0xab9, 0x00073ffe, 0x000022a2, 589 1.1 riastrad 0x903, 0x000007ff, 0x00000000, 590 1.1 riastrad 0x22fc, 0x00002001, 0x00000001, 591 1.1 riastrad 0x22c9, 0xffffffff, 0x00ffffff, 592 1.1 riastrad 0xc281, 0x0000ff0f, 0x00000000, 593 1.1 riastrad 0xa293, 0x07ffffff, 0x06000000, 594 1.1 riastrad 0xf9e, 0x00000001, 0x00000002, 595 1.1 riastrad 0x31da, 0x00000008, 0x00000008, 596 1.1 riastrad 0x31dc, 0x00000f00, 0x00000800, 597 1.1 riastrad 0x31dd, 0x00000f00, 0x00000800, 598 1.1 riastrad 0x31e6, 0x00ffffff, 0x00ff7fbf, 599 1.1 riastrad 0x31e7, 0x00ffffff, 0x00ff7faf, 600 1.1 riastrad 0x2300, 0x000000ff, 0x00000800, 601 1.1 riastrad 0x390, 0x00001fff, 0x00001fff, 602 1.1 riastrad 0x2418, 0x0000007f, 0x00000020, 603 1.1 riastrad 0x2542, 0x00010000, 0x00010000, 604 1.1 riastrad 0x2b80, 0x00100000, 0x000ff07c, 605 1.1 riastrad 0x2b05, 0x000003ff, 0x0000000f, 606 1.1 riastrad 0x2b04, 0xffffffff, 0x7564fdec, 607 1.1 riastrad 0x2b03, 0xffffffff, 0x3120b9a8, 608 1.1 riastrad 0x2b02, 0x20000000, 0x0f9c0000 609 1.1 riastrad }; 610 1.1 riastrad 611 1.1 riastrad static const u32 hawaii_mgcg_cgcg_init[] = 612 1.1 riastrad { 613 1.1 riastrad 0x3108, 0xffffffff, 0xfffffffd, 614 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 615 1.1 riastrad 0xf0a8, 0xffffffff, 0x00000100, 616 1.1 riastrad 0xf082, 0xffffffff, 0x00000100, 617 1.1 riastrad 0xf0b0, 0xffffffff, 0x00000100, 618 1.1 riastrad 0xf0b2, 0xffffffff, 0x00000100, 619 1.1 riastrad 0xf0b1, 0xffffffff, 0x00000100, 620 1.1 riastrad 0x1579, 0xffffffff, 0x00200100, 621 1.1 riastrad 0xf0a0, 0xffffffff, 0x00000100, 622 1.1 riastrad 0xf085, 0xffffffff, 0x06000100, 623 1.1 riastrad 0xf088, 0xffffffff, 0x00000100, 624 1.1 riastrad 0xf086, 0xffffffff, 0x06000100, 625 1.1 riastrad 0xf081, 0xffffffff, 0x00000100, 626 1.1 riastrad 0xf0b8, 0xffffffff, 0x00000100, 627 1.1 riastrad 0xf089, 0xffffffff, 0x00000100, 628 1.1 riastrad 0xf080, 0xffffffff, 0x00000100, 629 1.1 riastrad 0xf08c, 0xffffffff, 0x00000100, 630 1.1 riastrad 0xf08d, 0xffffffff, 0x00000100, 631 1.1 riastrad 0xf094, 0xffffffff, 0x00000100, 632 1.1 riastrad 0xf095, 0xffffffff, 0x00000100, 633 1.1 riastrad 0xf096, 0xffffffff, 0x00000100, 634 1.1 riastrad 0xf097, 0xffffffff, 0x00000100, 635 1.1 riastrad 0xf098, 0xffffffff, 0x00000100, 636 1.1 riastrad 0xf09f, 0xffffffff, 0x00000100, 637 1.1 riastrad 0xf09e, 0xffffffff, 0x00000100, 638 1.1 riastrad 0xf084, 0xffffffff, 0x06000100, 639 1.1 riastrad 0xf0a4, 0xffffffff, 0x00000100, 640 1.1 riastrad 0xf09d, 0xffffffff, 0x00000100, 641 1.1 riastrad 0xf0ad, 0xffffffff, 0x00000100, 642 1.1 riastrad 0xf0ac, 0xffffffff, 0x00000100, 643 1.1 riastrad 0xf09c, 0xffffffff, 0x00000100, 644 1.1 riastrad 0xc200, 0xffffffff, 0xe0000000, 645 1.1 riastrad 0xf008, 0xffffffff, 0x00010000, 646 1.1 riastrad 0xf009, 0xffffffff, 0x00030002, 647 1.1 riastrad 0xf00a, 0xffffffff, 0x00040007, 648 1.1 riastrad 0xf00b, 0xffffffff, 0x00060005, 649 1.1 riastrad 0xf00c, 0xffffffff, 0x00090008, 650 1.1 riastrad 0xf00d, 0xffffffff, 0x00010000, 651 1.1 riastrad 0xf00e, 0xffffffff, 0x00030002, 652 1.1 riastrad 0xf00f, 0xffffffff, 0x00040007, 653 1.1 riastrad 0xf010, 0xffffffff, 0x00060005, 654 1.1 riastrad 0xf011, 0xffffffff, 0x00090008, 655 1.1 riastrad 0xf012, 0xffffffff, 0x00010000, 656 1.1 riastrad 0xf013, 0xffffffff, 0x00030002, 657 1.1 riastrad 0xf014, 0xffffffff, 0x00040007, 658 1.1 riastrad 0xf015, 0xffffffff, 0x00060005, 659 1.1 riastrad 0xf016, 0xffffffff, 0x00090008, 660 1.1 riastrad 0xf017, 0xffffffff, 0x00010000, 661 1.1 riastrad 0xf018, 0xffffffff, 0x00030002, 662 1.1 riastrad 0xf019, 0xffffffff, 0x00040007, 663 1.1 riastrad 0xf01a, 0xffffffff, 0x00060005, 664 1.1 riastrad 0xf01b, 0xffffffff, 0x00090008, 665 1.1 riastrad 0xf01c, 0xffffffff, 0x00010000, 666 1.1 riastrad 0xf01d, 0xffffffff, 0x00030002, 667 1.1 riastrad 0xf01e, 0xffffffff, 0x00040007, 668 1.1 riastrad 0xf01f, 0xffffffff, 0x00060005, 669 1.1 riastrad 0xf020, 0xffffffff, 0x00090008, 670 1.1 riastrad 0xf021, 0xffffffff, 0x00010000, 671 1.1 riastrad 0xf022, 0xffffffff, 0x00030002, 672 1.1 riastrad 0xf023, 0xffffffff, 0x00040007, 673 1.1 riastrad 0xf024, 0xffffffff, 0x00060005, 674 1.1 riastrad 0xf025, 0xffffffff, 0x00090008, 675 1.1 riastrad 0xf026, 0xffffffff, 0x00010000, 676 1.1 riastrad 0xf027, 0xffffffff, 0x00030002, 677 1.1 riastrad 0xf028, 0xffffffff, 0x00040007, 678 1.1 riastrad 0xf029, 0xffffffff, 0x00060005, 679 1.1 riastrad 0xf02a, 0xffffffff, 0x00090008, 680 1.1 riastrad 0xf02b, 0xffffffff, 0x00010000, 681 1.1 riastrad 0xf02c, 0xffffffff, 0x00030002, 682 1.1 riastrad 0xf02d, 0xffffffff, 0x00040007, 683 1.1 riastrad 0xf02e, 0xffffffff, 0x00060005, 684 1.1 riastrad 0xf02f, 0xffffffff, 0x00090008, 685 1.1 riastrad 0xf030, 0xffffffff, 0x00010000, 686 1.1 riastrad 0xf031, 0xffffffff, 0x00030002, 687 1.1 riastrad 0xf032, 0xffffffff, 0x00040007, 688 1.1 riastrad 0xf033, 0xffffffff, 0x00060005, 689 1.1 riastrad 0xf034, 0xffffffff, 0x00090008, 690 1.1 riastrad 0xf035, 0xffffffff, 0x00010000, 691 1.1 riastrad 0xf036, 0xffffffff, 0x00030002, 692 1.1 riastrad 0xf037, 0xffffffff, 0x00040007, 693 1.1 riastrad 0xf038, 0xffffffff, 0x00060005, 694 1.1 riastrad 0xf039, 0xffffffff, 0x00090008, 695 1.1 riastrad 0xf03a, 0xffffffff, 0x00010000, 696 1.1 riastrad 0xf03b, 0xffffffff, 0x00030002, 697 1.1 riastrad 0xf03c, 0xffffffff, 0x00040007, 698 1.1 riastrad 0xf03d, 0xffffffff, 0x00060005, 699 1.1 riastrad 0xf03e, 0xffffffff, 0x00090008, 700 1.1 riastrad 0x30c6, 0xffffffff, 0x00020200, 701 1.1 riastrad 0xcd4, 0xffffffff, 0x00000200, 702 1.1 riastrad 0x570, 0xffffffff, 0x00000400, 703 1.1 riastrad 0x157a, 0xffffffff, 0x00000000, 704 1.1 riastrad 0xbd4, 0xffffffff, 0x00000902, 705 1.1 riastrad 0xf000, 0xffffffff, 0x96940200, 706 1.1 riastrad 0x21c2, 0xffffffff, 0x00900100, 707 1.1 riastrad 0x3109, 0xffffffff, 0x0020003f, 708 1.1 riastrad 0xe, 0xffffffff, 0x0140001c, 709 1.1 riastrad 0xf, 0x000f0000, 0x000f0000, 710 1.1 riastrad 0x88, 0xffffffff, 0xc060000c, 711 1.1 riastrad 0x89, 0xc0000fff, 0x00000100, 712 1.1 riastrad 0x3e4, 0xffffffff, 0x00000100, 713 1.1 riastrad 0x3e6, 0x00000101, 0x00000000, 714 1.1 riastrad 0x82a, 0xffffffff, 0x00000104, 715 1.1 riastrad 0x1579, 0xff000fff, 0x00000100, 716 1.1 riastrad 0xc33, 0xc0000fff, 0x00000104, 717 1.1 riastrad 0x3079, 0x00000001, 0x00000001, 718 1.1 riastrad 0x3403, 0xff000ff0, 0x00000100, 719 1.1 riastrad 0x3603, 0xff000ff0, 0x00000100 720 1.1 riastrad }; 721 1.1 riastrad 722 1.1 riastrad static const u32 godavari_golden_registers[] = 723 1.1 riastrad { 724 1.1 riastrad 0x1579, 0xff607fff, 0xfc000100, 725 1.1 riastrad 0x1bb6, 0x00010101, 0x00010000, 726 1.1 riastrad 0x260c, 0xffffffff, 0x00000000, 727 1.1 riastrad 0x260c0, 0xf00fffff, 0x00000400, 728 1.1 riastrad 0x184c, 0xffffffff, 0x00010000, 729 1.1 riastrad 0x16ec, 0x000000f0, 0x00000070, 730 1.1 riastrad 0x16f0, 0xf0311fff, 0x80300000, 731 1.1 riastrad 0x263e, 0x73773777, 0x12010001, 732 1.1 riastrad 0x263f, 0xffffffff, 0x00000010, 733 1.1 riastrad 0x200c, 0x00001f0f, 0x0000100a, 734 1.1 riastrad 0xbd2, 0x73773777, 0x12010001, 735 1.1 riastrad 0x902, 0x000fffff, 0x000c007f, 736 1.1 riastrad 0x2285, 0xf000003f, 0x00000007, 737 1.1 riastrad 0x22c9, 0xffffffff, 0x00ff0fff, 738 1.1 riastrad 0xc281, 0x0000ff0f, 0x00000000, 739 1.1 riastrad 0xa293, 0x07ffffff, 0x06000000, 740 1.1 riastrad 0x136, 0x00000fff, 0x00000100, 741 1.1 riastrad 0x3405, 0x00010000, 0x00810001, 742 1.1 riastrad 0x3605, 0x00010000, 0x00810001, 743 1.1 riastrad 0xf9e, 0x00000001, 0x00000002, 744 1.1 riastrad 0x31da, 0x00000008, 0x00000008, 745 1.1 riastrad 0x31dc, 0x00000f00, 0x00000800, 746 1.1 riastrad 0x31dd, 0x00000f00, 0x00000800, 747 1.1 riastrad 0x31e6, 0x00ffffff, 0x00ff7fbf, 748 1.1 riastrad 0x31e7, 0x00ffffff, 0x00ff7faf, 749 1.1 riastrad 0x2300, 0x000000ff, 0x00000001, 750 1.1 riastrad 0x853e, 0x01ff01ff, 0x00000002, 751 1.1 riastrad 0x8526, 0x007ff800, 0x00200000, 752 1.1 riastrad 0x8057, 0xffffffff, 0x00000f40, 753 1.1 riastrad 0x2231, 0x001f3ae3, 0x00000082, 754 1.1 riastrad 0x2235, 0x0000001f, 0x00000010, 755 1.1 riastrad 0xc24d, 0xffffffff, 0x00000000 756 1.1 riastrad }; 757 1.1 riastrad 758 1.1 riastrad static void cik_init_golden_registers(struct amdgpu_device *adev) 759 1.1 riastrad { 760 1.1 riastrad /* Some of the registers might be dependent on GRBM_GFX_INDEX */ 761 1.1 riastrad mutex_lock(&adev->grbm_idx_mutex); 762 1.1 riastrad 763 1.1 riastrad switch (adev->asic_type) { 764 1.1 riastrad case CHIP_BONAIRE: 765 1.4 riastrad amdgpu_device_program_register_sequence(adev, 766 1.4 riastrad bonaire_mgcg_cgcg_init, 767 1.4 riastrad ARRAY_SIZE(bonaire_mgcg_cgcg_init)); 768 1.4 riastrad amdgpu_device_program_register_sequence(adev, 769 1.4 riastrad bonaire_golden_registers, 770 1.4 riastrad ARRAY_SIZE(bonaire_golden_registers)); 771 1.4 riastrad amdgpu_device_program_register_sequence(adev, 772 1.4 riastrad bonaire_golden_common_registers, 773 1.4 riastrad ARRAY_SIZE(bonaire_golden_common_registers)); 774 1.4 riastrad amdgpu_device_program_register_sequence(adev, 775 1.4 riastrad bonaire_golden_spm_registers, 776 1.4 riastrad ARRAY_SIZE(bonaire_golden_spm_registers)); 777 1.1 riastrad break; 778 1.1 riastrad case CHIP_KABINI: 779 1.4 riastrad amdgpu_device_program_register_sequence(adev, 780 1.4 riastrad kalindi_mgcg_cgcg_init, 781 1.4 riastrad ARRAY_SIZE(kalindi_mgcg_cgcg_init)); 782 1.4 riastrad amdgpu_device_program_register_sequence(adev, 783 1.4 riastrad kalindi_golden_registers, 784 1.4 riastrad ARRAY_SIZE(kalindi_golden_registers)); 785 1.4 riastrad amdgpu_device_program_register_sequence(adev, 786 1.4 riastrad kalindi_golden_common_registers, 787 1.4 riastrad ARRAY_SIZE(kalindi_golden_common_registers)); 788 1.4 riastrad amdgpu_device_program_register_sequence(adev, 789 1.4 riastrad kalindi_golden_spm_registers, 790 1.4 riastrad ARRAY_SIZE(kalindi_golden_spm_registers)); 791 1.1 riastrad break; 792 1.1 riastrad case CHIP_MULLINS: 793 1.4 riastrad amdgpu_device_program_register_sequence(adev, 794 1.4 riastrad kalindi_mgcg_cgcg_init, 795 1.4 riastrad ARRAY_SIZE(kalindi_mgcg_cgcg_init)); 796 1.4 riastrad amdgpu_device_program_register_sequence(adev, 797 1.4 riastrad godavari_golden_registers, 798 1.4 riastrad ARRAY_SIZE(godavari_golden_registers)); 799 1.4 riastrad amdgpu_device_program_register_sequence(adev, 800 1.4 riastrad kalindi_golden_common_registers, 801 1.4 riastrad ARRAY_SIZE(kalindi_golden_common_registers)); 802 1.4 riastrad amdgpu_device_program_register_sequence(adev, 803 1.4 riastrad kalindi_golden_spm_registers, 804 1.4 riastrad ARRAY_SIZE(kalindi_golden_spm_registers)); 805 1.1 riastrad break; 806 1.1 riastrad case CHIP_KAVERI: 807 1.4 riastrad amdgpu_device_program_register_sequence(adev, 808 1.4 riastrad spectre_mgcg_cgcg_init, 809 1.4 riastrad ARRAY_SIZE(spectre_mgcg_cgcg_init)); 810 1.4 riastrad amdgpu_device_program_register_sequence(adev, 811 1.4 riastrad spectre_golden_registers, 812 1.4 riastrad ARRAY_SIZE(spectre_golden_registers)); 813 1.4 riastrad amdgpu_device_program_register_sequence(adev, 814 1.4 riastrad spectre_golden_common_registers, 815 1.4 riastrad ARRAY_SIZE(spectre_golden_common_registers)); 816 1.4 riastrad amdgpu_device_program_register_sequence(adev, 817 1.4 riastrad spectre_golden_spm_registers, 818 1.4 riastrad ARRAY_SIZE(spectre_golden_spm_registers)); 819 1.1 riastrad break; 820 1.1 riastrad case CHIP_HAWAII: 821 1.4 riastrad amdgpu_device_program_register_sequence(adev, 822 1.4 riastrad hawaii_mgcg_cgcg_init, 823 1.4 riastrad ARRAY_SIZE(hawaii_mgcg_cgcg_init)); 824 1.4 riastrad amdgpu_device_program_register_sequence(adev, 825 1.4 riastrad hawaii_golden_registers, 826 1.4 riastrad ARRAY_SIZE(hawaii_golden_registers)); 827 1.4 riastrad amdgpu_device_program_register_sequence(adev, 828 1.4 riastrad hawaii_golden_common_registers, 829 1.4 riastrad ARRAY_SIZE(hawaii_golden_common_registers)); 830 1.4 riastrad amdgpu_device_program_register_sequence(adev, 831 1.4 riastrad hawaii_golden_spm_registers, 832 1.4 riastrad ARRAY_SIZE(hawaii_golden_spm_registers)); 833 1.1 riastrad break; 834 1.1 riastrad default: 835 1.1 riastrad break; 836 1.1 riastrad } 837 1.1 riastrad mutex_unlock(&adev->grbm_idx_mutex); 838 1.1 riastrad } 839 1.1 riastrad 840 1.1 riastrad /** 841 1.1 riastrad * cik_get_xclk - get the xclk 842 1.1 riastrad * 843 1.1 riastrad * @adev: amdgpu_device pointer 844 1.1 riastrad * 845 1.1 riastrad * Returns the reference clock used by the gfx engine 846 1.1 riastrad * (CIK). 847 1.1 riastrad */ 848 1.1 riastrad static u32 cik_get_xclk(struct amdgpu_device *adev) 849 1.1 riastrad { 850 1.1 riastrad u32 reference_clock = adev->clock.spll.reference_freq; 851 1.1 riastrad 852 1.1 riastrad if (adev->flags & AMD_IS_APU) { 853 1.1 riastrad if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK) 854 1.1 riastrad return reference_clock / 2; 855 1.1 riastrad } else { 856 1.1 riastrad if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK) 857 1.1 riastrad return reference_clock / 4; 858 1.1 riastrad } 859 1.1 riastrad return reference_clock; 860 1.1 riastrad } 861 1.1 riastrad 862 1.1 riastrad /** 863 1.1 riastrad * cik_srbm_select - select specific register instances 864 1.1 riastrad * 865 1.1 riastrad * @adev: amdgpu_device pointer 866 1.1 riastrad * @me: selected ME (micro engine) 867 1.1 riastrad * @pipe: pipe 868 1.1 riastrad * @queue: queue 869 1.1 riastrad * @vmid: VMID 870 1.1 riastrad * 871 1.1 riastrad * Switches the currently active registers instances. Some 872 1.1 riastrad * registers are instanced per VMID, others are instanced per 873 1.1 riastrad * me/pipe/queue combination. 874 1.1 riastrad */ 875 1.1 riastrad void cik_srbm_select(struct amdgpu_device *adev, 876 1.1 riastrad u32 me, u32 pipe, u32 queue, u32 vmid) 877 1.1 riastrad { 878 1.1 riastrad u32 srbm_gfx_cntl = 879 1.1 riastrad (((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)| 880 1.1 riastrad ((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)| 881 1.1 riastrad ((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)| 882 1.1 riastrad ((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK)); 883 1.1 riastrad WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl); 884 1.1 riastrad } 885 1.1 riastrad 886 1.1 riastrad static void cik_vga_set_state(struct amdgpu_device *adev, bool state) 887 1.1 riastrad { 888 1.1 riastrad uint32_t tmp; 889 1.1 riastrad 890 1.1 riastrad tmp = RREG32(mmCONFIG_CNTL); 891 1.4 riastrad if (!state) 892 1.1 riastrad tmp |= CONFIG_CNTL__VGA_DIS_MASK; 893 1.1 riastrad else 894 1.1 riastrad tmp &= ~CONFIG_CNTL__VGA_DIS_MASK; 895 1.1 riastrad WREG32(mmCONFIG_CNTL, tmp); 896 1.1 riastrad } 897 1.1 riastrad 898 1.1 riastrad static bool cik_read_disabled_bios(struct amdgpu_device *adev) 899 1.1 riastrad { 900 1.1 riastrad u32 bus_cntl; 901 1.1 riastrad u32 d1vga_control = 0; 902 1.1 riastrad u32 d2vga_control = 0; 903 1.1 riastrad u32 vga_render_control = 0; 904 1.1 riastrad u32 rom_cntl; 905 1.1 riastrad bool r; 906 1.1 riastrad 907 1.1 riastrad bus_cntl = RREG32(mmBUS_CNTL); 908 1.1 riastrad if (adev->mode_info.num_crtc) { 909 1.1 riastrad d1vga_control = RREG32(mmD1VGA_CONTROL); 910 1.1 riastrad d2vga_control = RREG32(mmD2VGA_CONTROL); 911 1.1 riastrad vga_render_control = RREG32(mmVGA_RENDER_CONTROL); 912 1.1 riastrad } 913 1.1 riastrad rom_cntl = RREG32_SMC(ixROM_CNTL); 914 1.1 riastrad 915 1.1 riastrad /* enable the rom */ 916 1.1 riastrad WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK)); 917 1.1 riastrad if (adev->mode_info.num_crtc) { 918 1.1 riastrad /* Disable VGA mode */ 919 1.1 riastrad WREG32(mmD1VGA_CONTROL, 920 1.1 riastrad (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK | 921 1.1 riastrad D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK))); 922 1.1 riastrad WREG32(mmD2VGA_CONTROL, 923 1.1 riastrad (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK | 924 1.1 riastrad D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK))); 925 1.1 riastrad WREG32(mmVGA_RENDER_CONTROL, 926 1.1 riastrad (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK)); 927 1.1 riastrad } 928 1.1 riastrad WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK); 929 1.1 riastrad 930 1.1 riastrad r = amdgpu_read_bios(adev); 931 1.1 riastrad 932 1.1 riastrad /* restore regs */ 933 1.1 riastrad WREG32(mmBUS_CNTL, bus_cntl); 934 1.1 riastrad if (adev->mode_info.num_crtc) { 935 1.1 riastrad WREG32(mmD1VGA_CONTROL, d1vga_control); 936 1.1 riastrad WREG32(mmD2VGA_CONTROL, d2vga_control); 937 1.1 riastrad WREG32(mmVGA_RENDER_CONTROL, vga_render_control); 938 1.1 riastrad } 939 1.1 riastrad WREG32_SMC(ixROM_CNTL, rom_cntl); 940 1.1 riastrad return r; 941 1.1 riastrad } 942 1.1 riastrad 943 1.4 riastrad static bool cik_read_bios_from_rom(struct amdgpu_device *adev, 944 1.4 riastrad u8 *bios, u32 length_bytes) 945 1.1 riastrad { 946 1.4 riastrad u32 *dw_ptr; 947 1.4 riastrad unsigned long flags; 948 1.4 riastrad u32 i, length_dw; 949 1.4 riastrad 950 1.4 riastrad if (bios == NULL) 951 1.4 riastrad return false; 952 1.4 riastrad if (length_bytes == 0) 953 1.4 riastrad return false; 954 1.4 riastrad /* APU vbios image is part of sbios image */ 955 1.4 riastrad if (adev->flags & AMD_IS_APU) 956 1.4 riastrad return false; 957 1.1 riastrad 958 1.4 riastrad dw_ptr = (u32 *)bios; 959 1.4 riastrad length_dw = ALIGN(length_bytes, 4) / 4; 960 1.4 riastrad /* take the smc lock since we are using the smc index */ 961 1.4 riastrad spin_lock_irqsave(&adev->smc_idx_lock, flags); 962 1.4 riastrad /* set rom index to 0 */ 963 1.4 riastrad WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX); 964 1.4 riastrad WREG32(mmSMC_IND_DATA_0, 0); 965 1.4 riastrad /* set index to data for continous read */ 966 1.4 riastrad WREG32(mmSMC_IND_INDEX_0, ixROM_DATA); 967 1.4 riastrad for (i = 0; i < length_dw; i++) 968 1.4 riastrad dw_ptr[i] = RREG32(mmSMC_IND_DATA_0); 969 1.4 riastrad spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 970 1.4 riastrad 971 1.4 riastrad return true; 972 1.4 riastrad } 973 1.1 riastrad 974 1.4 riastrad static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = { 975 1.4 riastrad {mmGRBM_STATUS}, 976 1.4 riastrad {mmGRBM_STATUS2}, 977 1.4 riastrad {mmGRBM_STATUS_SE0}, 978 1.4 riastrad {mmGRBM_STATUS_SE1}, 979 1.4 riastrad {mmGRBM_STATUS_SE2}, 980 1.4 riastrad {mmGRBM_STATUS_SE3}, 981 1.4 riastrad {mmSRBM_STATUS}, 982 1.4 riastrad {mmSRBM_STATUS2}, 983 1.4 riastrad {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET}, 984 1.4 riastrad {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET}, 985 1.4 riastrad {mmCP_STAT}, 986 1.4 riastrad {mmCP_STALLED_STAT1}, 987 1.4 riastrad {mmCP_STALLED_STAT2}, 988 1.4 riastrad {mmCP_STALLED_STAT3}, 989 1.4 riastrad {mmCP_CPF_BUSY_STAT}, 990 1.4 riastrad {mmCP_CPF_STALLED_STAT1}, 991 1.4 riastrad {mmCP_CPF_STATUS}, 992 1.4 riastrad {mmCP_CPC_BUSY_STAT}, 993 1.4 riastrad {mmCP_CPC_STALLED_STAT1}, 994 1.4 riastrad {mmCP_CPC_STATUS}, 995 1.4 riastrad {mmGB_ADDR_CONFIG}, 996 1.4 riastrad {mmMC_ARB_RAMCFG}, 997 1.4 riastrad {mmGB_TILE_MODE0}, 998 1.4 riastrad {mmGB_TILE_MODE1}, 999 1.4 riastrad {mmGB_TILE_MODE2}, 1000 1.4 riastrad {mmGB_TILE_MODE3}, 1001 1.4 riastrad {mmGB_TILE_MODE4}, 1002 1.4 riastrad {mmGB_TILE_MODE5}, 1003 1.4 riastrad {mmGB_TILE_MODE6}, 1004 1.4 riastrad {mmGB_TILE_MODE7}, 1005 1.4 riastrad {mmGB_TILE_MODE8}, 1006 1.4 riastrad {mmGB_TILE_MODE9}, 1007 1.4 riastrad {mmGB_TILE_MODE10}, 1008 1.4 riastrad {mmGB_TILE_MODE11}, 1009 1.4 riastrad {mmGB_TILE_MODE12}, 1010 1.4 riastrad {mmGB_TILE_MODE13}, 1011 1.4 riastrad {mmGB_TILE_MODE14}, 1012 1.4 riastrad {mmGB_TILE_MODE15}, 1013 1.4 riastrad {mmGB_TILE_MODE16}, 1014 1.4 riastrad {mmGB_TILE_MODE17}, 1015 1.4 riastrad {mmGB_TILE_MODE18}, 1016 1.4 riastrad {mmGB_TILE_MODE19}, 1017 1.4 riastrad {mmGB_TILE_MODE20}, 1018 1.4 riastrad {mmGB_TILE_MODE21}, 1019 1.4 riastrad {mmGB_TILE_MODE22}, 1020 1.4 riastrad {mmGB_TILE_MODE23}, 1021 1.4 riastrad {mmGB_TILE_MODE24}, 1022 1.4 riastrad {mmGB_TILE_MODE25}, 1023 1.4 riastrad {mmGB_TILE_MODE26}, 1024 1.4 riastrad {mmGB_TILE_MODE27}, 1025 1.4 riastrad {mmGB_TILE_MODE28}, 1026 1.4 riastrad {mmGB_TILE_MODE29}, 1027 1.4 riastrad {mmGB_TILE_MODE30}, 1028 1.4 riastrad {mmGB_TILE_MODE31}, 1029 1.4 riastrad {mmGB_MACROTILE_MODE0}, 1030 1.4 riastrad {mmGB_MACROTILE_MODE1}, 1031 1.4 riastrad {mmGB_MACROTILE_MODE2}, 1032 1.4 riastrad {mmGB_MACROTILE_MODE3}, 1033 1.4 riastrad {mmGB_MACROTILE_MODE4}, 1034 1.4 riastrad {mmGB_MACROTILE_MODE5}, 1035 1.4 riastrad {mmGB_MACROTILE_MODE6}, 1036 1.4 riastrad {mmGB_MACROTILE_MODE7}, 1037 1.4 riastrad {mmGB_MACROTILE_MODE8}, 1038 1.4 riastrad {mmGB_MACROTILE_MODE9}, 1039 1.4 riastrad {mmGB_MACROTILE_MODE10}, 1040 1.4 riastrad {mmGB_MACROTILE_MODE11}, 1041 1.4 riastrad {mmGB_MACROTILE_MODE12}, 1042 1.4 riastrad {mmGB_MACROTILE_MODE13}, 1043 1.4 riastrad {mmGB_MACROTILE_MODE14}, 1044 1.4 riastrad {mmGB_MACROTILE_MODE15}, 1045 1.4 riastrad {mmCC_RB_BACKEND_DISABLE, true}, 1046 1.4 riastrad {mmGC_USER_RB_BACKEND_DISABLE, true}, 1047 1.4 riastrad {mmGB_BACKEND_MAP, false}, 1048 1.4 riastrad {mmPA_SC_RASTER_CONFIG, true}, 1049 1.4 riastrad {mmPA_SC_RASTER_CONFIG_1, true}, 1050 1.4 riastrad }; 1051 1.4 riastrad 1052 1.4 riastrad 1053 1.4 riastrad static uint32_t cik_get_register_value(struct amdgpu_device *adev, 1054 1.4 riastrad bool indexed, u32 se_num, 1055 1.4 riastrad u32 sh_num, u32 reg_offset) 1056 1.4 riastrad { 1057 1.4 riastrad if (indexed) { 1058 1.4 riastrad uint32_t val; 1059 1.4 riastrad unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; 1060 1.4 riastrad unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; 1061 1.4 riastrad 1062 1.4 riastrad switch (reg_offset) { 1063 1.4 riastrad case mmCC_RB_BACKEND_DISABLE: 1064 1.4 riastrad return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; 1065 1.4 riastrad case mmGC_USER_RB_BACKEND_DISABLE: 1066 1.4 riastrad return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; 1067 1.4 riastrad case mmPA_SC_RASTER_CONFIG: 1068 1.4 riastrad return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; 1069 1.4 riastrad case mmPA_SC_RASTER_CONFIG_1: 1070 1.4 riastrad return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1; 1071 1.4 riastrad } 1072 1.1 riastrad 1073 1.4 riastrad mutex_lock(&adev->grbm_idx_mutex); 1074 1.4 riastrad if (se_num != 0xffffffff || sh_num != 0xffffffff) 1075 1.4 riastrad amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); 1076 1.4 riastrad 1077 1.4 riastrad val = RREG32(reg_offset); 1078 1.4 riastrad 1079 1.4 riastrad if (se_num != 0xffffffff || sh_num != 0xffffffff) 1080 1.4 riastrad amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1081 1.4 riastrad mutex_unlock(&adev->grbm_idx_mutex); 1082 1.4 riastrad return val; 1083 1.4 riastrad } else { 1084 1.4 riastrad unsigned idx; 1085 1.4 riastrad 1086 1.4 riastrad switch (reg_offset) { 1087 1.4 riastrad case mmGB_ADDR_CONFIG: 1088 1.4 riastrad return adev->gfx.config.gb_addr_config; 1089 1.4 riastrad case mmMC_ARB_RAMCFG: 1090 1.4 riastrad return adev->gfx.config.mc_arb_ramcfg; 1091 1.4 riastrad case mmGB_TILE_MODE0: 1092 1.4 riastrad case mmGB_TILE_MODE1: 1093 1.4 riastrad case mmGB_TILE_MODE2: 1094 1.4 riastrad case mmGB_TILE_MODE3: 1095 1.4 riastrad case mmGB_TILE_MODE4: 1096 1.4 riastrad case mmGB_TILE_MODE5: 1097 1.4 riastrad case mmGB_TILE_MODE6: 1098 1.4 riastrad case mmGB_TILE_MODE7: 1099 1.4 riastrad case mmGB_TILE_MODE8: 1100 1.4 riastrad case mmGB_TILE_MODE9: 1101 1.4 riastrad case mmGB_TILE_MODE10: 1102 1.4 riastrad case mmGB_TILE_MODE11: 1103 1.4 riastrad case mmGB_TILE_MODE12: 1104 1.4 riastrad case mmGB_TILE_MODE13: 1105 1.4 riastrad case mmGB_TILE_MODE14: 1106 1.4 riastrad case mmGB_TILE_MODE15: 1107 1.4 riastrad case mmGB_TILE_MODE16: 1108 1.4 riastrad case mmGB_TILE_MODE17: 1109 1.4 riastrad case mmGB_TILE_MODE18: 1110 1.4 riastrad case mmGB_TILE_MODE19: 1111 1.4 riastrad case mmGB_TILE_MODE20: 1112 1.4 riastrad case mmGB_TILE_MODE21: 1113 1.4 riastrad case mmGB_TILE_MODE22: 1114 1.4 riastrad case mmGB_TILE_MODE23: 1115 1.4 riastrad case mmGB_TILE_MODE24: 1116 1.4 riastrad case mmGB_TILE_MODE25: 1117 1.4 riastrad case mmGB_TILE_MODE26: 1118 1.4 riastrad case mmGB_TILE_MODE27: 1119 1.4 riastrad case mmGB_TILE_MODE28: 1120 1.4 riastrad case mmGB_TILE_MODE29: 1121 1.4 riastrad case mmGB_TILE_MODE30: 1122 1.4 riastrad case mmGB_TILE_MODE31: 1123 1.4 riastrad idx = (reg_offset - mmGB_TILE_MODE0); 1124 1.4 riastrad return adev->gfx.config.tile_mode_array[idx]; 1125 1.4 riastrad case mmGB_MACROTILE_MODE0: 1126 1.4 riastrad case mmGB_MACROTILE_MODE1: 1127 1.4 riastrad case mmGB_MACROTILE_MODE2: 1128 1.4 riastrad case mmGB_MACROTILE_MODE3: 1129 1.4 riastrad case mmGB_MACROTILE_MODE4: 1130 1.4 riastrad case mmGB_MACROTILE_MODE5: 1131 1.4 riastrad case mmGB_MACROTILE_MODE6: 1132 1.4 riastrad case mmGB_MACROTILE_MODE7: 1133 1.4 riastrad case mmGB_MACROTILE_MODE8: 1134 1.4 riastrad case mmGB_MACROTILE_MODE9: 1135 1.4 riastrad case mmGB_MACROTILE_MODE10: 1136 1.4 riastrad case mmGB_MACROTILE_MODE11: 1137 1.4 riastrad case mmGB_MACROTILE_MODE12: 1138 1.4 riastrad case mmGB_MACROTILE_MODE13: 1139 1.4 riastrad case mmGB_MACROTILE_MODE14: 1140 1.4 riastrad case mmGB_MACROTILE_MODE15: 1141 1.4 riastrad idx = (reg_offset - mmGB_MACROTILE_MODE0); 1142 1.4 riastrad return adev->gfx.config.macrotile_mode_array[idx]; 1143 1.4 riastrad default: 1144 1.4 riastrad return RREG32(reg_offset); 1145 1.4 riastrad } 1146 1.4 riastrad } 1147 1.1 riastrad } 1148 1.1 riastrad 1149 1.1 riastrad static int cik_read_register(struct amdgpu_device *adev, u32 se_num, 1150 1.1 riastrad u32 sh_num, u32 reg_offset, u32 *value) 1151 1.1 riastrad { 1152 1.1 riastrad uint32_t i; 1153 1.1 riastrad 1154 1.1 riastrad *value = 0; 1155 1.1 riastrad for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) { 1156 1.4 riastrad bool indexed = cik_allowed_read_registers[i].grbm_indexed; 1157 1.4 riastrad 1158 1.1 riastrad if (reg_offset != cik_allowed_read_registers[i].reg_offset) 1159 1.1 riastrad continue; 1160 1.1 riastrad 1161 1.4 riastrad *value = cik_get_register_value(adev, indexed, se_num, sh_num, 1162 1.4 riastrad reg_offset); 1163 1.1 riastrad return 0; 1164 1.1 riastrad } 1165 1.1 riastrad return -EINVAL; 1166 1.1 riastrad } 1167 1.1 riastrad 1168 1.1 riastrad struct kv_reset_save_regs { 1169 1.1 riastrad u32 gmcon_reng_execute; 1170 1.1 riastrad u32 gmcon_misc; 1171 1.1 riastrad u32 gmcon_misc3; 1172 1.1 riastrad }; 1173 1.1 riastrad 1174 1.1 riastrad static void kv_save_regs_for_reset(struct amdgpu_device *adev, 1175 1.1 riastrad struct kv_reset_save_regs *save) 1176 1.1 riastrad { 1177 1.1 riastrad save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE); 1178 1.1 riastrad save->gmcon_misc = RREG32(mmGMCON_MISC); 1179 1.1 riastrad save->gmcon_misc3 = RREG32(mmGMCON_MISC3); 1180 1.1 riastrad 1181 1.1 riastrad WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute & 1182 1.1 riastrad ~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK); 1183 1.1 riastrad WREG32(mmGMCON_MISC, save->gmcon_misc & 1184 1.1 riastrad ~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK | 1185 1.1 riastrad GMCON_MISC__STCTRL_STUTTER_EN_MASK)); 1186 1.1 riastrad } 1187 1.1 riastrad 1188 1.1 riastrad static void kv_restore_regs_for_reset(struct amdgpu_device *adev, 1189 1.1 riastrad struct kv_reset_save_regs *save) 1190 1.1 riastrad { 1191 1.1 riastrad int i; 1192 1.1 riastrad 1193 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1194 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff); 1195 1.1 riastrad 1196 1.1 riastrad for (i = 0; i < 5; i++) 1197 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1198 1.1 riastrad 1199 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1200 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff); 1201 1.1 riastrad 1202 1.1 riastrad for (i = 0; i < 5; i++) 1203 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1204 1.1 riastrad 1205 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x210000); 1206 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff); 1207 1.1 riastrad 1208 1.1 riastrad for (i = 0; i < 5; i++) 1209 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1210 1.1 riastrad 1211 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x21003); 1212 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff); 1213 1.1 riastrad 1214 1.1 riastrad for (i = 0; i < 5; i++) 1215 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1216 1.1 riastrad 1217 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x2b00); 1218 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff); 1219 1.1 riastrad 1220 1.1 riastrad for (i = 0; i < 5; i++) 1221 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1222 1.1 riastrad 1223 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1224 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff); 1225 1.1 riastrad 1226 1.1 riastrad for (i = 0; i < 5; i++) 1227 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1228 1.1 riastrad 1229 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x420000); 1230 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff); 1231 1.1 riastrad 1232 1.1 riastrad for (i = 0; i < 5; i++) 1233 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1234 1.1 riastrad 1235 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x120202); 1236 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff); 1237 1.1 riastrad 1238 1.1 riastrad for (i = 0; i < 5; i++) 1239 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1240 1.1 riastrad 1241 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36); 1242 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff); 1243 1.1 riastrad 1244 1.1 riastrad for (i = 0; i < 5; i++) 1245 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1246 1.1 riastrad 1247 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e); 1248 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff); 1249 1.1 riastrad 1250 1.1 riastrad for (i = 0; i < 5; i++) 1251 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0); 1252 1.1 riastrad 1253 1.1 riastrad WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332); 1254 1.1 riastrad WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff); 1255 1.1 riastrad 1256 1.1 riastrad WREG32(mmGMCON_MISC3, save->gmcon_misc3); 1257 1.1 riastrad WREG32(mmGMCON_MISC, save->gmcon_misc); 1258 1.1 riastrad WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute); 1259 1.1 riastrad } 1260 1.1 riastrad 1261 1.4 riastrad static int cik_gpu_pci_config_reset(struct amdgpu_device *adev) 1262 1.1 riastrad { 1263 1.1 riastrad struct kv_reset_save_regs kv_save = { 0 }; 1264 1.4 riastrad u32 i; 1265 1.4 riastrad int r = -EINVAL; 1266 1.1 riastrad 1267 1.1 riastrad dev_info(adev->dev, "GPU pci config reset\n"); 1268 1.1 riastrad 1269 1.1 riastrad if (adev->flags & AMD_IS_APU) 1270 1.1 riastrad kv_save_regs_for_reset(adev, &kv_save); 1271 1.1 riastrad 1272 1.1 riastrad /* disable BM */ 1273 1.1 riastrad pci_clear_master(adev->pdev); 1274 1.1 riastrad /* reset */ 1275 1.4 riastrad amdgpu_device_pci_config_reset(adev); 1276 1.1 riastrad 1277 1.1 riastrad udelay(100); 1278 1.1 riastrad 1279 1.1 riastrad /* wait for asic to come out of reset */ 1280 1.1 riastrad for (i = 0; i < adev->usec_timeout; i++) { 1281 1.4 riastrad if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { 1282 1.4 riastrad /* enable BM */ 1283 1.4 riastrad pci_set_master(adev->pdev); 1284 1.4 riastrad adev->has_hw_reset = true; 1285 1.4 riastrad r = 0; 1286 1.1 riastrad break; 1287 1.4 riastrad } 1288 1.1 riastrad udelay(1); 1289 1.1 riastrad } 1290 1.1 riastrad 1291 1.1 riastrad /* does asic init need to be run first??? */ 1292 1.1 riastrad if (adev->flags & AMD_IS_APU) 1293 1.1 riastrad kv_restore_regs_for_reset(adev, &kv_save); 1294 1.4 riastrad 1295 1.4 riastrad return r; 1296 1.1 riastrad } 1297 1.1 riastrad 1298 1.4 riastrad /** 1299 1.4 riastrad * cik_asic_pci_config_reset - soft reset GPU 1300 1.4 riastrad * 1301 1.4 riastrad * @adev: amdgpu_device pointer 1302 1.4 riastrad * 1303 1.4 riastrad * Use PCI Config method to reset the GPU. 1304 1.4 riastrad * 1305 1.4 riastrad * Returns 0 for success. 1306 1.4 riastrad */ 1307 1.4 riastrad static int cik_asic_pci_config_reset(struct amdgpu_device *adev) 1308 1.4 riastrad { 1309 1.4 riastrad int r; 1310 1.4 riastrad 1311 1.4 riastrad amdgpu_atombios_scratch_regs_engine_hung(adev, true); 1312 1.4 riastrad 1313 1.4 riastrad r = cik_gpu_pci_config_reset(adev); 1314 1.4 riastrad 1315 1.4 riastrad amdgpu_atombios_scratch_regs_engine_hung(adev, false); 1316 1.4 riastrad 1317 1.4 riastrad return r; 1318 1.4 riastrad } 1319 1.4 riastrad 1320 1.4 riastrad static bool cik_asic_supports_baco(struct amdgpu_device *adev) 1321 1.4 riastrad { 1322 1.4 riastrad switch (adev->asic_type) { 1323 1.4 riastrad case CHIP_BONAIRE: 1324 1.4 riastrad case CHIP_HAWAII: 1325 1.4 riastrad return amdgpu_dpm_is_baco_supported(adev); 1326 1.4 riastrad default: 1327 1.4 riastrad return false; 1328 1.4 riastrad } 1329 1.4 riastrad } 1330 1.4 riastrad 1331 1.4 riastrad static enum amd_reset_method 1332 1.4 riastrad cik_asic_reset_method(struct amdgpu_device *adev) 1333 1.1 riastrad { 1334 1.4 riastrad bool baco_reset; 1335 1.4 riastrad 1336 1.4 riastrad switch (adev->asic_type) { 1337 1.4 riastrad case CHIP_BONAIRE: 1338 1.4 riastrad case CHIP_HAWAII: 1339 1.4 riastrad /* disable baco reset until it works */ 1340 1.4 riastrad /* smu7_asic_get_baco_capability(adev, &baco_reset); */ 1341 1.4 riastrad baco_reset = false; 1342 1.4 riastrad break; 1343 1.4 riastrad default: 1344 1.4 riastrad baco_reset = false; 1345 1.4 riastrad break; 1346 1.4 riastrad } 1347 1.1 riastrad 1348 1.4 riastrad if (baco_reset) 1349 1.4 riastrad return AMD_RESET_METHOD_BACO; 1350 1.1 riastrad else 1351 1.4 riastrad return AMD_RESET_METHOD_LEGACY; 1352 1.1 riastrad } 1353 1.1 riastrad 1354 1.1 riastrad /** 1355 1.1 riastrad * cik_asic_reset - soft reset GPU 1356 1.1 riastrad * 1357 1.1 riastrad * @adev: amdgpu_device pointer 1358 1.1 riastrad * 1359 1.1 riastrad * Look up which blocks are hung and attempt 1360 1.1 riastrad * to reset them. 1361 1.1 riastrad * Returns 0 for success. 1362 1.1 riastrad */ 1363 1.1 riastrad static int cik_asic_reset(struct amdgpu_device *adev) 1364 1.1 riastrad { 1365 1.4 riastrad int r; 1366 1.1 riastrad 1367 1.4 riastrad if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { 1368 1.4 riastrad if (!adev->in_suspend) 1369 1.4 riastrad amdgpu_inc_vram_lost(adev); 1370 1.4 riastrad r = amdgpu_dpm_baco_reset(adev); 1371 1.4 riastrad } else { 1372 1.4 riastrad r = cik_asic_pci_config_reset(adev); 1373 1.4 riastrad } 1374 1.1 riastrad 1375 1.4 riastrad return r; 1376 1.4 riastrad } 1377 1.1 riastrad 1378 1.4 riastrad static u32 cik_get_config_memsize(struct amdgpu_device *adev) 1379 1.4 riastrad { 1380 1.4 riastrad return RREG32(mmCONFIG_MEMSIZE); 1381 1.1 riastrad } 1382 1.1 riastrad 1383 1.1 riastrad static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock, 1384 1.1 riastrad u32 cntl_reg, u32 status_reg) 1385 1.1 riastrad { 1386 1.1 riastrad int r, i; 1387 1.1 riastrad struct atom_clock_dividers dividers; 1388 1.1 riastrad uint32_t tmp; 1389 1.1 riastrad 1390 1.1 riastrad r = amdgpu_atombios_get_clock_dividers(adev, 1391 1.1 riastrad COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, 1392 1.1 riastrad clock, false, ÷rs); 1393 1.1 riastrad if (r) 1394 1.1 riastrad return r; 1395 1.1 riastrad 1396 1.1 riastrad tmp = RREG32_SMC(cntl_reg); 1397 1.1 riastrad tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK | 1398 1.1 riastrad CG_DCLK_CNTL__DCLK_DIVIDER_MASK); 1399 1.1 riastrad tmp |= dividers.post_divider; 1400 1.1 riastrad WREG32_SMC(cntl_reg, tmp); 1401 1.1 riastrad 1402 1.1 riastrad for (i = 0; i < 100; i++) { 1403 1.1 riastrad if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK) 1404 1.1 riastrad break; 1405 1.1 riastrad mdelay(10); 1406 1.1 riastrad } 1407 1.1 riastrad if (i == 100) 1408 1.1 riastrad return -ETIMEDOUT; 1409 1.1 riastrad 1410 1.1 riastrad return 0; 1411 1.1 riastrad } 1412 1.1 riastrad 1413 1.1 riastrad static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk) 1414 1.1 riastrad { 1415 1.1 riastrad int r = 0; 1416 1.1 riastrad 1417 1.1 riastrad r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS); 1418 1.1 riastrad if (r) 1419 1.1 riastrad return r; 1420 1.1 riastrad 1421 1.1 riastrad r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS); 1422 1.1 riastrad return r; 1423 1.1 riastrad } 1424 1.1 riastrad 1425 1.1 riastrad static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk) 1426 1.1 riastrad { 1427 1.1 riastrad int r, i; 1428 1.1 riastrad struct atom_clock_dividers dividers; 1429 1.1 riastrad u32 tmp; 1430 1.1 riastrad 1431 1.1 riastrad r = amdgpu_atombios_get_clock_dividers(adev, 1432 1.1 riastrad COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, 1433 1.1 riastrad ecclk, false, ÷rs); 1434 1.1 riastrad if (r) 1435 1.1 riastrad return r; 1436 1.1 riastrad 1437 1.1 riastrad for (i = 0; i < 100; i++) { 1438 1.1 riastrad if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK) 1439 1.1 riastrad break; 1440 1.1 riastrad mdelay(10); 1441 1.1 riastrad } 1442 1.1 riastrad if (i == 100) 1443 1.1 riastrad return -ETIMEDOUT; 1444 1.1 riastrad 1445 1.1 riastrad tmp = RREG32_SMC(ixCG_ECLK_CNTL); 1446 1.1 riastrad tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK | 1447 1.1 riastrad CG_ECLK_CNTL__ECLK_DIVIDER_MASK); 1448 1.1 riastrad tmp |= dividers.post_divider; 1449 1.1 riastrad WREG32_SMC(ixCG_ECLK_CNTL, tmp); 1450 1.1 riastrad 1451 1.1 riastrad for (i = 0; i < 100; i++) { 1452 1.1 riastrad if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK) 1453 1.1 riastrad break; 1454 1.1 riastrad mdelay(10); 1455 1.1 riastrad } 1456 1.1 riastrad if (i == 100) 1457 1.1 riastrad return -ETIMEDOUT; 1458 1.1 riastrad 1459 1.1 riastrad return 0; 1460 1.1 riastrad } 1461 1.1 riastrad 1462 1.1 riastrad static void cik_pcie_gen3_enable(struct amdgpu_device *adev) 1463 1.1 riastrad { 1464 1.1 riastrad struct pci_dev *root = adev->pdev->bus->self; 1465 1.4 riastrad u32 speed_cntl, current_data_rate; 1466 1.4 riastrad int i; 1467 1.1 riastrad u16 tmp16; 1468 1.1 riastrad 1469 1.1 riastrad if (pci_is_root_bus(adev->pdev->bus)) 1470 1.1 riastrad return; 1471 1.1 riastrad 1472 1.1 riastrad if (amdgpu_pcie_gen2 == 0) 1473 1.1 riastrad return; 1474 1.1 riastrad 1475 1.1 riastrad if (adev->flags & AMD_IS_APU) 1476 1.1 riastrad return; 1477 1.1 riastrad 1478 1.4 riastrad if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | 1479 1.4 riastrad CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3))) 1480 1.1 riastrad return; 1481 1.1 riastrad 1482 1.1 riastrad speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL); 1483 1.1 riastrad current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >> 1484 1.1 riastrad PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT; 1485 1.4 riastrad if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { 1486 1.1 riastrad if (current_data_rate == 2) { 1487 1.1 riastrad DRM_INFO("PCIE gen 3 link speeds already enabled\n"); 1488 1.1 riastrad return; 1489 1.1 riastrad } 1490 1.1 riastrad DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n"); 1491 1.4 riastrad } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) { 1492 1.1 riastrad if (current_data_rate == 1) { 1493 1.1 riastrad DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 1494 1.1 riastrad return; 1495 1.1 riastrad } 1496 1.1 riastrad DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n"); 1497 1.1 riastrad } 1498 1.1 riastrad 1499 1.4 riastrad if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev)) 1500 1.1 riastrad return; 1501 1.1 riastrad 1502 1.4 riastrad if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { 1503 1.1 riastrad /* re-try equalization if gen3 is not already enabled */ 1504 1.1 riastrad if (current_data_rate != 2) { 1505 1.1 riastrad u16 bridge_cfg, gpu_cfg; 1506 1.1 riastrad u16 bridge_cfg2, gpu_cfg2; 1507 1.1 riastrad u32 max_lw, current_lw, tmp; 1508 1.1 riastrad 1509 1.4 riastrad pcie_capability_read_word(root, PCI_EXP_LNKCTL, 1510 1.4 riastrad &bridge_cfg); 1511 1.4 riastrad pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL, 1512 1.4 riastrad &gpu_cfg); 1513 1.1 riastrad 1514 1.1 riastrad tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD; 1515 1.4 riastrad pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16); 1516 1.1 riastrad 1517 1.1 riastrad tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD; 1518 1.4 riastrad pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL, 1519 1.4 riastrad tmp16); 1520 1.1 riastrad 1521 1.1 riastrad tmp = RREG32_PCIE(ixPCIE_LC_STATUS1); 1522 1.1 riastrad max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >> 1523 1.1 riastrad PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT; 1524 1.1 riastrad current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK) 1525 1.1 riastrad >> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT; 1526 1.1 riastrad 1527 1.1 riastrad if (current_lw < max_lw) { 1528 1.1 riastrad tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL); 1529 1.1 riastrad if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) { 1530 1.1 riastrad tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK | 1531 1.1 riastrad PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK); 1532 1.1 riastrad tmp |= (max_lw << 1533 1.1 riastrad PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT); 1534 1.1 riastrad tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK | 1535 1.1 riastrad PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK | 1536 1.1 riastrad PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK; 1537 1.1 riastrad WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp); 1538 1.1 riastrad } 1539 1.1 riastrad } 1540 1.1 riastrad 1541 1.1 riastrad for (i = 0; i < 10; i++) { 1542 1.1 riastrad /* check status */ 1543 1.4 riastrad pcie_capability_read_word(adev->pdev, 1544 1.4 riastrad PCI_EXP_DEVSTA, 1545 1.4 riastrad &tmp16); 1546 1.1 riastrad if (tmp16 & PCI_EXP_DEVSTA_TRPND) 1547 1.1 riastrad break; 1548 1.1 riastrad 1549 1.4 riastrad pcie_capability_read_word(root, PCI_EXP_LNKCTL, 1550 1.4 riastrad &bridge_cfg); 1551 1.4 riastrad pcie_capability_read_word(adev->pdev, 1552 1.4 riastrad PCI_EXP_LNKCTL, 1553 1.4 riastrad &gpu_cfg); 1554 1.4 riastrad 1555 1.4 riastrad pcie_capability_read_word(root, PCI_EXP_LNKCTL2, 1556 1.4 riastrad &bridge_cfg2); 1557 1.4 riastrad pcie_capability_read_word(adev->pdev, 1558 1.4 riastrad PCI_EXP_LNKCTL2, 1559 1.4 riastrad &gpu_cfg2); 1560 1.1 riastrad 1561 1.1 riastrad tmp = RREG32_PCIE(ixPCIE_LC_CNTL4); 1562 1.1 riastrad tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK; 1563 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL4, tmp); 1564 1.1 riastrad 1565 1.1 riastrad tmp = RREG32_PCIE(ixPCIE_LC_CNTL4); 1566 1.1 riastrad tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK; 1567 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL4, tmp); 1568 1.1 riastrad 1569 1.4 riastrad msleep(100); 1570 1.1 riastrad 1571 1.1 riastrad /* linkctl */ 1572 1.4 riastrad pcie_capability_read_word(root, PCI_EXP_LNKCTL, 1573 1.4 riastrad &tmp16); 1574 1.1 riastrad tmp16 &= ~PCI_EXP_LNKCTL_HAWD; 1575 1.1 riastrad tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD); 1576 1.4 riastrad pcie_capability_write_word(root, PCI_EXP_LNKCTL, 1577 1.4 riastrad tmp16); 1578 1.1 riastrad 1579 1.4 riastrad pcie_capability_read_word(adev->pdev, 1580 1.4 riastrad PCI_EXP_LNKCTL, 1581 1.4 riastrad &tmp16); 1582 1.1 riastrad tmp16 &= ~PCI_EXP_LNKCTL_HAWD; 1583 1.1 riastrad tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD); 1584 1.4 riastrad pcie_capability_write_word(adev->pdev, 1585 1.4 riastrad PCI_EXP_LNKCTL, 1586 1.4 riastrad tmp16); 1587 1.1 riastrad 1588 1.1 riastrad /* linkctl2 */ 1589 1.4 riastrad pcie_capability_read_word(root, PCI_EXP_LNKCTL2, 1590 1.4 riastrad &tmp16); 1591 1.4 riastrad tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP | 1592 1.4 riastrad PCI_EXP_LNKCTL2_TX_MARGIN); 1593 1.4 riastrad tmp16 |= (bridge_cfg2 & 1594 1.4 riastrad (PCI_EXP_LNKCTL2_ENTER_COMP | 1595 1.4 riastrad PCI_EXP_LNKCTL2_TX_MARGIN)); 1596 1.4 riastrad pcie_capability_write_word(root, 1597 1.4 riastrad PCI_EXP_LNKCTL2, 1598 1.4 riastrad tmp16); 1599 1.4 riastrad 1600 1.4 riastrad pcie_capability_read_word(adev->pdev, 1601 1.4 riastrad PCI_EXP_LNKCTL2, 1602 1.4 riastrad &tmp16); 1603 1.4 riastrad tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP | 1604 1.4 riastrad PCI_EXP_LNKCTL2_TX_MARGIN); 1605 1.4 riastrad tmp16 |= (gpu_cfg2 & 1606 1.4 riastrad (PCI_EXP_LNKCTL2_ENTER_COMP | 1607 1.4 riastrad PCI_EXP_LNKCTL2_TX_MARGIN)); 1608 1.4 riastrad pcie_capability_write_word(adev->pdev, 1609 1.4 riastrad PCI_EXP_LNKCTL2, 1610 1.4 riastrad tmp16); 1611 1.1 riastrad 1612 1.1 riastrad tmp = RREG32_PCIE(ixPCIE_LC_CNTL4); 1613 1.1 riastrad tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK; 1614 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL4, tmp); 1615 1.1 riastrad } 1616 1.1 riastrad } 1617 1.1 riastrad } 1618 1.1 riastrad 1619 1.1 riastrad /* set the link speed */ 1620 1.1 riastrad speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK | 1621 1.1 riastrad PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK; 1622 1.1 riastrad speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK; 1623 1.1 riastrad WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl); 1624 1.1 riastrad 1625 1.4 riastrad pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16); 1626 1.4 riastrad tmp16 &= ~PCI_EXP_LNKCTL2_TLS; 1627 1.4 riastrad 1628 1.4 riastrad if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) 1629 1.4 riastrad tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */ 1630 1.4 riastrad else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) 1631 1.4 riastrad tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */ 1632 1.1 riastrad else 1633 1.4 riastrad tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */ 1634 1.4 riastrad pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16); 1635 1.1 riastrad 1636 1.1 riastrad speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL); 1637 1.1 riastrad speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK; 1638 1.1 riastrad WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl); 1639 1.1 riastrad 1640 1.1 riastrad for (i = 0; i < adev->usec_timeout; i++) { 1641 1.1 riastrad speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL); 1642 1.1 riastrad if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0) 1643 1.1 riastrad break; 1644 1.1 riastrad udelay(1); 1645 1.1 riastrad } 1646 1.1 riastrad } 1647 1.1 riastrad 1648 1.1 riastrad static void cik_program_aspm(struct amdgpu_device *adev) 1649 1.1 riastrad { 1650 1.1 riastrad u32 data, orig; 1651 1.1 riastrad bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false; 1652 1.1 riastrad bool disable_clkreq = false; 1653 1.1 riastrad 1654 1.1 riastrad if (amdgpu_aspm == 0) 1655 1.1 riastrad return; 1656 1.1 riastrad 1657 1.4 riastrad if (pci_is_root_bus(adev->pdev->bus)) 1658 1.4 riastrad return; 1659 1.4 riastrad 1660 1.1 riastrad /* XXX double check APUs */ 1661 1.1 riastrad if (adev->flags & AMD_IS_APU) 1662 1.1 riastrad return; 1663 1.1 riastrad 1664 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL); 1665 1.1 riastrad data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK; 1666 1.1 riastrad data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) | 1667 1.1 riastrad PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK; 1668 1.1 riastrad if (orig != data) 1669 1.1 riastrad WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data); 1670 1.1 riastrad 1671 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3); 1672 1.1 riastrad data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK; 1673 1.1 riastrad if (orig != data) 1674 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL3, data); 1675 1.1 riastrad 1676 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_P_CNTL); 1677 1.1 riastrad data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK; 1678 1.1 riastrad if (orig != data) 1679 1.1 riastrad WREG32_PCIE(ixPCIE_P_CNTL, data); 1680 1.1 riastrad 1681 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_CNTL); 1682 1.1 riastrad data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK | 1683 1.1 riastrad PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK); 1684 1.1 riastrad data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK; 1685 1.1 riastrad if (!disable_l0s) 1686 1.1 riastrad data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT); 1687 1.1 riastrad 1688 1.1 riastrad if (!disable_l1) { 1689 1.1 riastrad data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT); 1690 1.1 riastrad data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK; 1691 1.1 riastrad if (orig != data) 1692 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL, data); 1693 1.1 riastrad 1694 1.1 riastrad if (!disable_plloff_in_l1) { 1695 1.1 riastrad bool clk_req_support; 1696 1.1 riastrad 1697 1.1 riastrad orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0); 1698 1.1 riastrad data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK | 1699 1.1 riastrad PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK); 1700 1.1 riastrad data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) | 1701 1.1 riastrad (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT); 1702 1.1 riastrad if (orig != data) 1703 1.1 riastrad WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data); 1704 1.1 riastrad 1705 1.1 riastrad orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1); 1706 1.1 riastrad data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK | 1707 1.1 riastrad PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK); 1708 1.1 riastrad data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) | 1709 1.1 riastrad (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT); 1710 1.1 riastrad if (orig != data) 1711 1.1 riastrad WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data); 1712 1.1 riastrad 1713 1.1 riastrad orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0); 1714 1.1 riastrad data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK | 1715 1.1 riastrad PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK); 1716 1.1 riastrad data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) | 1717 1.1 riastrad (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT); 1718 1.1 riastrad if (orig != data) 1719 1.1 riastrad WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data); 1720 1.1 riastrad 1721 1.1 riastrad orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1); 1722 1.1 riastrad data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK | 1723 1.1 riastrad PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK); 1724 1.1 riastrad data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) | 1725 1.1 riastrad (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT); 1726 1.1 riastrad if (orig != data) 1727 1.1 riastrad WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data); 1728 1.1 riastrad 1729 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL); 1730 1.1 riastrad data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK; 1731 1.1 riastrad data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT); 1732 1.1 riastrad if (orig != data) 1733 1.1 riastrad WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data); 1734 1.1 riastrad 1735 1.1 riastrad if (!disable_clkreq) { 1736 1.1 riastrad struct pci_dev *root = adev->pdev->bus->self; 1737 1.1 riastrad u32 lnkcap; 1738 1.1 riastrad 1739 1.1 riastrad clk_req_support = false; 1740 1.1 riastrad pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap); 1741 1.1 riastrad if (lnkcap & PCI_EXP_LNKCAP_CLKPM) 1742 1.1 riastrad clk_req_support = true; 1743 1.1 riastrad } else { 1744 1.1 riastrad clk_req_support = false; 1745 1.1 riastrad } 1746 1.1 riastrad 1747 1.1 riastrad if (clk_req_support) { 1748 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2); 1749 1.1 riastrad data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK | 1750 1.1 riastrad PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK; 1751 1.1 riastrad if (orig != data) 1752 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL2, data); 1753 1.1 riastrad 1754 1.1 riastrad orig = data = RREG32_SMC(ixTHM_CLK_CNTL); 1755 1.1 riastrad data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK | 1756 1.1 riastrad THM_CLK_CNTL__TMON_CLK_SEL_MASK); 1757 1.1 riastrad data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) | 1758 1.1 riastrad (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT); 1759 1.1 riastrad if (orig != data) 1760 1.1 riastrad WREG32_SMC(ixTHM_CLK_CNTL, data); 1761 1.1 riastrad 1762 1.1 riastrad orig = data = RREG32_SMC(ixMISC_CLK_CTRL); 1763 1.1 riastrad data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK | 1764 1.1 riastrad MISC_CLK_CTRL__ZCLK_SEL_MASK); 1765 1.1 riastrad data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) | 1766 1.1 riastrad (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT); 1767 1.1 riastrad if (orig != data) 1768 1.1 riastrad WREG32_SMC(ixMISC_CLK_CTRL, data); 1769 1.1 riastrad 1770 1.1 riastrad orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL); 1771 1.1 riastrad data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK; 1772 1.1 riastrad if (orig != data) 1773 1.1 riastrad WREG32_SMC(ixCG_CLKPIN_CNTL, data); 1774 1.1 riastrad 1775 1.1 riastrad orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2); 1776 1.1 riastrad data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK; 1777 1.1 riastrad if (orig != data) 1778 1.1 riastrad WREG32_SMC(ixCG_CLKPIN_CNTL_2, data); 1779 1.1 riastrad 1780 1.1 riastrad orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL); 1781 1.1 riastrad data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK; 1782 1.1 riastrad data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT); 1783 1.1 riastrad if (orig != data) 1784 1.1 riastrad WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data); 1785 1.1 riastrad } 1786 1.1 riastrad } 1787 1.1 riastrad } else { 1788 1.1 riastrad if (orig != data) 1789 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL, data); 1790 1.1 riastrad } 1791 1.1 riastrad 1792 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_CNTL2); 1793 1.1 riastrad data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK | 1794 1.1 riastrad PCIE_CNTL2__MST_MEM_LS_EN_MASK | 1795 1.1 riastrad PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK; 1796 1.1 riastrad if (orig != data) 1797 1.1 riastrad WREG32_PCIE(ixPCIE_CNTL2, data); 1798 1.1 riastrad 1799 1.1 riastrad if (!disable_l0s) { 1800 1.1 riastrad data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL); 1801 1.1 riastrad if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) == 1802 1.1 riastrad PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) { 1803 1.1 riastrad data = RREG32_PCIE(ixPCIE_LC_STATUS1); 1804 1.1 riastrad if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) && 1805 1.1 riastrad (data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) { 1806 1.1 riastrad orig = data = RREG32_PCIE(ixPCIE_LC_CNTL); 1807 1.1 riastrad data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK; 1808 1.1 riastrad if (orig != data) 1809 1.1 riastrad WREG32_PCIE(ixPCIE_LC_CNTL, data); 1810 1.1 riastrad } 1811 1.1 riastrad } 1812 1.1 riastrad } 1813 1.1 riastrad } 1814 1.1 riastrad 1815 1.1 riastrad static uint32_t cik_get_rev_id(struct amdgpu_device *adev) 1816 1.1 riastrad { 1817 1.1 riastrad return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK) 1818 1.1 riastrad >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT; 1819 1.1 riastrad } 1820 1.1 riastrad 1821 1.4 riastrad static void cik_detect_hw_virtualization(struct amdgpu_device *adev) 1822 1.1 riastrad { 1823 1.4 riastrad if (is_virtual_machine()) /* passthrough mode */ 1824 1.4 riastrad adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; 1825 1.4 riastrad } 1826 1.4 riastrad 1827 1.4 riastrad static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring) 1828 1.4 riastrad { 1829 1.4 riastrad if (!ring || !ring->funcs->emit_wreg) { 1830 1.4 riastrad WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 1831 1.4 riastrad RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL); 1832 1.4 riastrad } else { 1833 1.4 riastrad amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 1834 1.4 riastrad } 1835 1.4 riastrad } 1836 1.1 riastrad 1837 1.4 riastrad static void cik_invalidate_hdp(struct amdgpu_device *adev, 1838 1.4 riastrad struct amdgpu_ring *ring) 1839 1.1 riastrad { 1840 1.4 riastrad if (!ring || !ring->funcs->emit_wreg) { 1841 1.4 riastrad WREG32(mmHDP_DEBUG0, 1); 1842 1.4 riastrad RREG32(mmHDP_DEBUG0); 1843 1.4 riastrad } else { 1844 1.4 riastrad amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1); 1845 1.1 riastrad } 1846 1.4 riastrad } 1847 1.4 riastrad 1848 1.4 riastrad static bool cik_need_full_reset(struct amdgpu_device *adev) 1849 1.4 riastrad { 1850 1.4 riastrad /* change this when we support soft reset */ 1851 1.4 riastrad return true; 1852 1.4 riastrad } 1853 1.4 riastrad 1854 1.4 riastrad static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0, 1855 1.4 riastrad uint64_t *count1) 1856 1.4 riastrad { 1857 1.4 riastrad uint32_t perfctr = 0; 1858 1.4 riastrad uint64_t cnt0_of, cnt1_of; 1859 1.4 riastrad int tmp; 1860 1.4 riastrad 1861 1.4 riastrad /* This reports 0 on APUs, so return to avoid writing/reading registers 1862 1.4 riastrad * that may or may not be different from their GPU counterparts 1863 1.4 riastrad */ 1864 1.4 riastrad if (adev->flags & AMD_IS_APU) 1865 1.4 riastrad return; 1866 1.4 riastrad 1867 1.4 riastrad /* Set the 2 events that we wish to watch, defined above */ 1868 1.4 riastrad /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */ 1869 1.4 riastrad perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40); 1870 1.4 riastrad perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104); 1871 1.4 riastrad 1872 1.4 riastrad /* Write to enable desired perf counters */ 1873 1.4 riastrad WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr); 1874 1.4 riastrad /* Zero out and enable the perf counters 1875 1.4 riastrad * Write 0x5: 1876 1.4 riastrad * Bit 0 = Start all counters(1) 1877 1.4 riastrad * Bit 2 = Global counter reset enable(1) 1878 1.4 riastrad */ 1879 1.4 riastrad WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005); 1880 1.4 riastrad 1881 1.4 riastrad msleep(1000); 1882 1.4 riastrad 1883 1.4 riastrad /* Load the shadow and disable the perf counters 1884 1.4 riastrad * Write 0x2: 1885 1.4 riastrad * Bit 0 = Stop counters(0) 1886 1.4 riastrad * Bit 1 = Load the shadow counters(1) 1887 1.4 riastrad */ 1888 1.4 riastrad WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002); 1889 1.4 riastrad 1890 1.4 riastrad /* Read register values to get any >32bit overflow */ 1891 1.4 riastrad tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK); 1892 1.4 riastrad cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER); 1893 1.4 riastrad cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER); 1894 1.4 riastrad 1895 1.4 riastrad /* Get the values and add the overflow */ 1896 1.4 riastrad *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32); 1897 1.4 riastrad *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32); 1898 1.4 riastrad } 1899 1.4 riastrad 1900 1.4 riastrad static bool cik_need_reset_on_init(struct amdgpu_device *adev) 1901 1.4 riastrad { 1902 1.4 riastrad u32 clock_cntl, pc; 1903 1.4 riastrad 1904 1.4 riastrad if (adev->flags & AMD_IS_APU) 1905 1.4 riastrad return false; 1906 1.1 riastrad 1907 1.4 riastrad /* check if the SMC is already running */ 1908 1.4 riastrad clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0); 1909 1.4 riastrad pc = RREG32_SMC(ixSMC_PC_C); 1910 1.4 riastrad if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) && 1911 1.4 riastrad (0x20100 <= pc)) 1912 1.4 riastrad return true; 1913 1.4 riastrad 1914 1.4 riastrad return false; 1915 1.4 riastrad } 1916 1.4 riastrad 1917 1.4 riastrad static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev) 1918 1.4 riastrad { 1919 1.4 riastrad uint64_t nak_r, nak_g; 1920 1.4 riastrad 1921 1.4 riastrad /* Get the number of NAKs received and generated */ 1922 1.4 riastrad nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK); 1923 1.4 riastrad nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED); 1924 1.4 riastrad 1925 1.4 riastrad /* Add the total number of NAKs, i.e the number of replays */ 1926 1.4 riastrad return (nak_r + nak_g); 1927 1.1 riastrad } 1928 1.1 riastrad 1929 1.1 riastrad static const struct amdgpu_asic_funcs cik_asic_funcs = 1930 1.1 riastrad { 1931 1.1 riastrad .read_disabled_bios = &cik_read_disabled_bios, 1932 1.4 riastrad .read_bios_from_rom = &cik_read_bios_from_rom, 1933 1.1 riastrad .read_register = &cik_read_register, 1934 1.1 riastrad .reset = &cik_asic_reset, 1935 1.4 riastrad .reset_method = &cik_asic_reset_method, 1936 1.1 riastrad .set_vga_state = &cik_vga_set_state, 1937 1.1 riastrad .get_xclk = &cik_get_xclk, 1938 1.1 riastrad .set_uvd_clocks = &cik_set_uvd_clocks, 1939 1.1 riastrad .set_vce_clocks = &cik_set_vce_clocks, 1940 1.4 riastrad .get_config_memsize = &cik_get_config_memsize, 1941 1.4 riastrad .flush_hdp = &cik_flush_hdp, 1942 1.4 riastrad .invalidate_hdp = &cik_invalidate_hdp, 1943 1.4 riastrad .need_full_reset = &cik_need_full_reset, 1944 1.4 riastrad .init_doorbell_index = &legacy_doorbell_index_init, 1945 1.4 riastrad .get_pcie_usage = &cik_get_pcie_usage, 1946 1.4 riastrad .need_reset_on_init = &cik_need_reset_on_init, 1947 1.4 riastrad .get_pcie_replay_count = &cik_get_pcie_replay_count, 1948 1.4 riastrad .supports_baco = &cik_asic_supports_baco, 1949 1.1 riastrad }; 1950 1.1 riastrad 1951 1.1 riastrad static int cik_common_early_init(void *handle) 1952 1.1 riastrad { 1953 1.1 riastrad struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1954 1.1 riastrad 1955 1.1 riastrad adev->smc_rreg = &cik_smc_rreg; 1956 1.1 riastrad adev->smc_wreg = &cik_smc_wreg; 1957 1.1 riastrad adev->pcie_rreg = &cik_pcie_rreg; 1958 1.1 riastrad adev->pcie_wreg = &cik_pcie_wreg; 1959 1.1 riastrad adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg; 1960 1.1 riastrad adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg; 1961 1.1 riastrad adev->didt_rreg = &cik_didt_rreg; 1962 1.1 riastrad adev->didt_wreg = &cik_didt_wreg; 1963 1.1 riastrad 1964 1.1 riastrad adev->asic_funcs = &cik_asic_funcs; 1965 1.1 riastrad 1966 1.1 riastrad adev->rev_id = cik_get_rev_id(adev); 1967 1.1 riastrad adev->external_rev_id = 0xFF; 1968 1.1 riastrad switch (adev->asic_type) { 1969 1.1 riastrad case CHIP_BONAIRE: 1970 1.1 riastrad adev->cg_flags = 1971 1.4 riastrad AMD_CG_SUPPORT_GFX_MGCG | 1972 1.4 riastrad AMD_CG_SUPPORT_GFX_MGLS | 1973 1.4 riastrad /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1974 1.4 riastrad AMD_CG_SUPPORT_GFX_CGLS | 1975 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS | 1976 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS_LS | 1977 1.4 riastrad AMD_CG_SUPPORT_GFX_CP_LS | 1978 1.4 riastrad AMD_CG_SUPPORT_MC_LS | 1979 1.4 riastrad AMD_CG_SUPPORT_MC_MGCG | 1980 1.4 riastrad AMD_CG_SUPPORT_SDMA_MGCG | 1981 1.4 riastrad AMD_CG_SUPPORT_SDMA_LS | 1982 1.4 riastrad AMD_CG_SUPPORT_BIF_LS | 1983 1.4 riastrad AMD_CG_SUPPORT_VCE_MGCG | 1984 1.4 riastrad AMD_CG_SUPPORT_UVD_MGCG | 1985 1.4 riastrad AMD_CG_SUPPORT_HDP_LS | 1986 1.4 riastrad AMD_CG_SUPPORT_HDP_MGCG; 1987 1.1 riastrad adev->pg_flags = 0; 1988 1.1 riastrad adev->external_rev_id = adev->rev_id + 0x14; 1989 1.1 riastrad break; 1990 1.1 riastrad case CHIP_HAWAII: 1991 1.1 riastrad adev->cg_flags = 1992 1.4 riastrad AMD_CG_SUPPORT_GFX_MGCG | 1993 1.4 riastrad AMD_CG_SUPPORT_GFX_MGLS | 1994 1.4 riastrad /*AMD_CG_SUPPORT_GFX_CGCG |*/ 1995 1.4 riastrad AMD_CG_SUPPORT_GFX_CGLS | 1996 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS | 1997 1.4 riastrad AMD_CG_SUPPORT_GFX_CP_LS | 1998 1.4 riastrad AMD_CG_SUPPORT_MC_LS | 1999 1.4 riastrad AMD_CG_SUPPORT_MC_MGCG | 2000 1.4 riastrad AMD_CG_SUPPORT_SDMA_MGCG | 2001 1.4 riastrad AMD_CG_SUPPORT_SDMA_LS | 2002 1.4 riastrad AMD_CG_SUPPORT_BIF_LS | 2003 1.4 riastrad AMD_CG_SUPPORT_VCE_MGCG | 2004 1.4 riastrad AMD_CG_SUPPORT_UVD_MGCG | 2005 1.4 riastrad AMD_CG_SUPPORT_HDP_LS | 2006 1.4 riastrad AMD_CG_SUPPORT_HDP_MGCG; 2007 1.1 riastrad adev->pg_flags = 0; 2008 1.1 riastrad adev->external_rev_id = 0x28; 2009 1.1 riastrad break; 2010 1.1 riastrad case CHIP_KAVERI: 2011 1.1 riastrad adev->cg_flags = 2012 1.4 riastrad AMD_CG_SUPPORT_GFX_MGCG | 2013 1.4 riastrad AMD_CG_SUPPORT_GFX_MGLS | 2014 1.4 riastrad /*AMD_CG_SUPPORT_GFX_CGCG |*/ 2015 1.4 riastrad AMD_CG_SUPPORT_GFX_CGLS | 2016 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS | 2017 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS_LS | 2018 1.4 riastrad AMD_CG_SUPPORT_GFX_CP_LS | 2019 1.4 riastrad AMD_CG_SUPPORT_SDMA_MGCG | 2020 1.4 riastrad AMD_CG_SUPPORT_SDMA_LS | 2021 1.4 riastrad AMD_CG_SUPPORT_BIF_LS | 2022 1.4 riastrad AMD_CG_SUPPORT_VCE_MGCG | 2023 1.4 riastrad AMD_CG_SUPPORT_UVD_MGCG | 2024 1.4 riastrad AMD_CG_SUPPORT_HDP_LS | 2025 1.4 riastrad AMD_CG_SUPPORT_HDP_MGCG; 2026 1.1 riastrad adev->pg_flags = 2027 1.4 riastrad /*AMD_PG_SUPPORT_GFX_PG | 2028 1.4 riastrad AMD_PG_SUPPORT_GFX_SMG | 2029 1.4 riastrad AMD_PG_SUPPORT_GFX_DMG |*/ 2030 1.4 riastrad AMD_PG_SUPPORT_UVD | 2031 1.4 riastrad AMD_PG_SUPPORT_VCE | 2032 1.4 riastrad /* AMD_PG_SUPPORT_CP | 2033 1.4 riastrad AMD_PG_SUPPORT_GDS | 2034 1.4 riastrad AMD_PG_SUPPORT_RLC_SMU_HS | 2035 1.4 riastrad AMD_PG_SUPPORT_ACP | 2036 1.4 riastrad AMD_PG_SUPPORT_SAMU |*/ 2037 1.1 riastrad 0; 2038 1.1 riastrad if (adev->pdev->device == 0x1312 || 2039 1.1 riastrad adev->pdev->device == 0x1316 || 2040 1.1 riastrad adev->pdev->device == 0x1317) 2041 1.1 riastrad adev->external_rev_id = 0x41; 2042 1.1 riastrad else 2043 1.1 riastrad adev->external_rev_id = 0x1; 2044 1.1 riastrad break; 2045 1.1 riastrad case CHIP_KABINI: 2046 1.1 riastrad case CHIP_MULLINS: 2047 1.1 riastrad adev->cg_flags = 2048 1.4 riastrad AMD_CG_SUPPORT_GFX_MGCG | 2049 1.4 riastrad AMD_CG_SUPPORT_GFX_MGLS | 2050 1.4 riastrad /*AMD_CG_SUPPORT_GFX_CGCG |*/ 2051 1.4 riastrad AMD_CG_SUPPORT_GFX_CGLS | 2052 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS | 2053 1.4 riastrad AMD_CG_SUPPORT_GFX_CGTS_LS | 2054 1.4 riastrad AMD_CG_SUPPORT_GFX_CP_LS | 2055 1.4 riastrad AMD_CG_SUPPORT_SDMA_MGCG | 2056 1.4 riastrad AMD_CG_SUPPORT_SDMA_LS | 2057 1.4 riastrad AMD_CG_SUPPORT_BIF_LS | 2058 1.4 riastrad AMD_CG_SUPPORT_VCE_MGCG | 2059 1.4 riastrad AMD_CG_SUPPORT_UVD_MGCG | 2060 1.4 riastrad AMD_CG_SUPPORT_HDP_LS | 2061 1.4 riastrad AMD_CG_SUPPORT_HDP_MGCG; 2062 1.1 riastrad adev->pg_flags = 2063 1.4 riastrad /*AMD_PG_SUPPORT_GFX_PG | 2064 1.4 riastrad AMD_PG_SUPPORT_GFX_SMG | */ 2065 1.4 riastrad AMD_PG_SUPPORT_UVD | 2066 1.4 riastrad /*AMD_PG_SUPPORT_VCE | 2067 1.4 riastrad AMD_PG_SUPPORT_CP | 2068 1.4 riastrad AMD_PG_SUPPORT_GDS | 2069 1.4 riastrad AMD_PG_SUPPORT_RLC_SMU_HS | 2070 1.4 riastrad AMD_PG_SUPPORT_SAMU |*/ 2071 1.1 riastrad 0; 2072 1.1 riastrad if (adev->asic_type == CHIP_KABINI) { 2073 1.1 riastrad if (adev->rev_id == 0) 2074 1.1 riastrad adev->external_rev_id = 0x81; 2075 1.1 riastrad else if (adev->rev_id == 1) 2076 1.1 riastrad adev->external_rev_id = 0x82; 2077 1.1 riastrad else if (adev->rev_id == 2) 2078 1.1 riastrad adev->external_rev_id = 0x85; 2079 1.1 riastrad } else 2080 1.1 riastrad adev->external_rev_id = adev->rev_id + 0xa1; 2081 1.1 riastrad break; 2082 1.1 riastrad default: 2083 1.1 riastrad /* FIXME: not supported yet */ 2084 1.1 riastrad return -EINVAL; 2085 1.1 riastrad } 2086 1.1 riastrad 2087 1.1 riastrad return 0; 2088 1.1 riastrad } 2089 1.1 riastrad 2090 1.1 riastrad static int cik_common_sw_init(void *handle) 2091 1.1 riastrad { 2092 1.1 riastrad return 0; 2093 1.1 riastrad } 2094 1.1 riastrad 2095 1.1 riastrad static int cik_common_sw_fini(void *handle) 2096 1.1 riastrad { 2097 1.1 riastrad return 0; 2098 1.1 riastrad } 2099 1.1 riastrad 2100 1.1 riastrad static int cik_common_hw_init(void *handle) 2101 1.1 riastrad { 2102 1.1 riastrad struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2103 1.1 riastrad 2104 1.1 riastrad /* move the golden regs per IP block */ 2105 1.1 riastrad cik_init_golden_registers(adev); 2106 1.1 riastrad /* enable pcie gen2/3 link */ 2107 1.1 riastrad cik_pcie_gen3_enable(adev); 2108 1.1 riastrad /* enable aspm */ 2109 1.1 riastrad cik_program_aspm(adev); 2110 1.1 riastrad 2111 1.1 riastrad return 0; 2112 1.1 riastrad } 2113 1.1 riastrad 2114 1.1 riastrad static int cik_common_hw_fini(void *handle) 2115 1.1 riastrad { 2116 1.1 riastrad return 0; 2117 1.1 riastrad } 2118 1.1 riastrad 2119 1.1 riastrad static int cik_common_suspend(void *handle) 2120 1.1 riastrad { 2121 1.1 riastrad struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2122 1.1 riastrad 2123 1.1 riastrad return cik_common_hw_fini(adev); 2124 1.1 riastrad } 2125 1.1 riastrad 2126 1.1 riastrad static int cik_common_resume(void *handle) 2127 1.1 riastrad { 2128 1.1 riastrad struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2129 1.1 riastrad 2130 1.4 riastrad return cik_common_hw_init(adev); 2131 1.1 riastrad } 2132 1.1 riastrad 2133 1.1 riastrad static bool cik_common_is_idle(void *handle) 2134 1.1 riastrad { 2135 1.1 riastrad return true; 2136 1.1 riastrad } 2137 1.1 riastrad 2138 1.1 riastrad static int cik_common_wait_for_idle(void *handle) 2139 1.1 riastrad { 2140 1.1 riastrad return 0; 2141 1.1 riastrad } 2142 1.1 riastrad 2143 1.1 riastrad static int cik_common_soft_reset(void *handle) 2144 1.1 riastrad { 2145 1.1 riastrad /* XXX hard reset?? */ 2146 1.1 riastrad return 0; 2147 1.1 riastrad } 2148 1.1 riastrad 2149 1.1 riastrad static int cik_common_set_clockgating_state(void *handle, 2150 1.1 riastrad enum amd_clockgating_state state) 2151 1.1 riastrad { 2152 1.1 riastrad return 0; 2153 1.1 riastrad } 2154 1.1 riastrad 2155 1.1 riastrad static int cik_common_set_powergating_state(void *handle, 2156 1.1 riastrad enum amd_powergating_state state) 2157 1.1 riastrad { 2158 1.1 riastrad return 0; 2159 1.1 riastrad } 2160 1.1 riastrad 2161 1.4 riastrad static const struct amd_ip_funcs cik_common_ip_funcs = { 2162 1.4 riastrad .name = "cik_common", 2163 1.1 riastrad .early_init = cik_common_early_init, 2164 1.1 riastrad .late_init = NULL, 2165 1.1 riastrad .sw_init = cik_common_sw_init, 2166 1.1 riastrad .sw_fini = cik_common_sw_fini, 2167 1.1 riastrad .hw_init = cik_common_hw_init, 2168 1.1 riastrad .hw_fini = cik_common_hw_fini, 2169 1.1 riastrad .suspend = cik_common_suspend, 2170 1.1 riastrad .resume = cik_common_resume, 2171 1.1 riastrad .is_idle = cik_common_is_idle, 2172 1.1 riastrad .wait_for_idle = cik_common_wait_for_idle, 2173 1.1 riastrad .soft_reset = cik_common_soft_reset, 2174 1.1 riastrad .set_clockgating_state = cik_common_set_clockgating_state, 2175 1.1 riastrad .set_powergating_state = cik_common_set_powergating_state, 2176 1.1 riastrad }; 2177 1.4 riastrad 2178 1.4 riastrad static const struct amdgpu_ip_block_version cik_common_ip_block = 2179 1.4 riastrad { 2180 1.4 riastrad .type = AMD_IP_BLOCK_TYPE_COMMON, 2181 1.4 riastrad .major = 1, 2182 1.4 riastrad .minor = 0, 2183 1.4 riastrad .rev = 0, 2184 1.4 riastrad .funcs = &cik_common_ip_funcs, 2185 1.4 riastrad }; 2186 1.4 riastrad 2187 1.4 riastrad int cik_set_ip_blocks(struct amdgpu_device *adev) 2188 1.4 riastrad { 2189 1.4 riastrad cik_detect_hw_virtualization(adev); 2190 1.4 riastrad 2191 1.4 riastrad switch (adev->asic_type) { 2192 1.4 riastrad case CHIP_BONAIRE: 2193 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_common_ip_block); 2194 1.4 riastrad amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block); 2195 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_ih_ip_block); 2196 1.4 riastrad amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block); 2197 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block); 2198 1.4 riastrad amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 2199 1.4 riastrad if (adev->enable_virtual_display) 2200 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2201 1.4 riastrad #if defined(CONFIG_DRM_AMD_DC) 2202 1.4 riastrad else if (amdgpu_device_has_dc_support(adev)) 2203 1.4 riastrad amdgpu_device_ip_block_add(adev, &dm_ip_block); 2204 1.4 riastrad #endif 2205 1.4 riastrad else 2206 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block); 2207 1.4 riastrad amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block); 2208 1.4 riastrad amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block); 2209 1.4 riastrad break; 2210 1.4 riastrad case CHIP_HAWAII: 2211 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_common_ip_block); 2212 1.4 riastrad amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block); 2213 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_ih_ip_block); 2214 1.4 riastrad amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block); 2215 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block); 2216 1.4 riastrad amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 2217 1.4 riastrad if (adev->enable_virtual_display) 2218 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2219 1.4 riastrad #if defined(CONFIG_DRM_AMD_DC) 2220 1.4 riastrad else if (amdgpu_device_has_dc_support(adev)) 2221 1.4 riastrad amdgpu_device_ip_block_add(adev, &dm_ip_block); 2222 1.4 riastrad #endif 2223 1.4 riastrad else 2224 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block); 2225 1.4 riastrad amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block); 2226 1.4 riastrad amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block); 2227 1.4 riastrad break; 2228 1.4 riastrad case CHIP_KAVERI: 2229 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_common_ip_block); 2230 1.4 riastrad amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block); 2231 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_ih_ip_block); 2232 1.4 riastrad amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block); 2233 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block); 2234 1.4 riastrad amdgpu_device_ip_block_add(adev, &kv_smu_ip_block); 2235 1.4 riastrad if (adev->enable_virtual_display) 2236 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2237 1.4 riastrad #if defined(CONFIG_DRM_AMD_DC) 2238 1.4 riastrad else if (amdgpu_device_has_dc_support(adev)) 2239 1.4 riastrad amdgpu_device_ip_block_add(adev, &dm_ip_block); 2240 1.4 riastrad #endif 2241 1.4 riastrad else 2242 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block); 2243 1.4 riastrad 2244 1.4 riastrad amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block); 2245 1.4 riastrad amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block); 2246 1.4 riastrad break; 2247 1.4 riastrad case CHIP_KABINI: 2248 1.4 riastrad case CHIP_MULLINS: 2249 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_common_ip_block); 2250 1.4 riastrad amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block); 2251 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_ih_ip_block); 2252 1.4 riastrad amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block); 2253 1.4 riastrad amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block); 2254 1.4 riastrad amdgpu_device_ip_block_add(adev, &kv_smu_ip_block); 2255 1.4 riastrad if (adev->enable_virtual_display) 2256 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 2257 1.4 riastrad #if defined(CONFIG_DRM_AMD_DC) 2258 1.4 riastrad else if (amdgpu_device_has_dc_support(adev)) 2259 1.4 riastrad amdgpu_device_ip_block_add(adev, &dm_ip_block); 2260 1.4 riastrad #endif 2261 1.4 riastrad else 2262 1.4 riastrad amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block); 2263 1.4 riastrad amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block); 2264 1.4 riastrad amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block); 2265 1.4 riastrad break; 2266 1.4 riastrad default: 2267 1.4 riastrad /* FIXME: not supported yet */ 2268 1.4 riastrad return -EINVAL; 2269 1.4 riastrad } 2270 1.4 riastrad return 0; 2271 1.4 riastrad } 2272