1 1.3 riastrad /* $NetBSD: radeon_ni.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2010 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.3 riastrad 27 1.1 riastrad #include <sys/cdefs.h> 28 1.3 riastrad __KERNEL_RCSID(0, "$NetBSD: radeon_ni.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $"); 29 1.1 riastrad 30 1.1 riastrad #include <linux/firmware.h> 31 1.3 riastrad #include <linux/module.h> 32 1.3 riastrad #include <linux/pci.h> 33 1.1 riastrad #include <linux/slab.h> 34 1.3 riastrad 35 1.3 riastrad #include <drm/radeon_drm.h> 36 1.3 riastrad 37 1.3 riastrad #include "atom.h" 38 1.3 riastrad #include "cayman_blit_shaders.h" 39 1.3 riastrad #include "clearstate_cayman.h" 40 1.3 riastrad #include "ni_reg.h" 41 1.3 riastrad #include "nid.h" 42 1.1 riastrad #include "radeon.h" 43 1.1 riastrad #include "radeon_asic.h" 44 1.1 riastrad #include "radeon_audio.h" 45 1.1 riastrad #include "radeon_ucode.h" 46 1.1 riastrad 47 1.2 riastrad #include <linux/nbsd-namespace.h> 48 1.2 riastrad 49 1.1 riastrad /* 50 1.1 riastrad * Indirect registers accessor 51 1.1 riastrad */ 52 1.1 riastrad u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg) 53 1.1 riastrad { 54 1.1 riastrad unsigned long flags; 55 1.1 riastrad u32 r; 56 1.1 riastrad 57 1.1 riastrad spin_lock_irqsave(&rdev->smc_idx_lock, flags); 58 1.1 riastrad WREG32(TN_SMC_IND_INDEX_0, (reg)); 59 1.1 riastrad r = RREG32(TN_SMC_IND_DATA_0); 60 1.1 riastrad spin_unlock_irqrestore(&rdev->smc_idx_lock, flags); 61 1.1 riastrad return r; 62 1.1 riastrad } 63 1.1 riastrad 64 1.1 riastrad void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v) 65 1.1 riastrad { 66 1.1 riastrad unsigned long flags; 67 1.1 riastrad 68 1.1 riastrad spin_lock_irqsave(&rdev->smc_idx_lock, flags); 69 1.1 riastrad WREG32(TN_SMC_IND_INDEX_0, (reg)); 70 1.1 riastrad WREG32(TN_SMC_IND_DATA_0, (v)); 71 1.1 riastrad spin_unlock_irqrestore(&rdev->smc_idx_lock, flags); 72 1.1 riastrad } 73 1.1 riastrad 74 1.1 riastrad static const u32 tn_rlc_save_restore_register_list[] = 75 1.1 riastrad { 76 1.1 riastrad 0x98fc, 77 1.1 riastrad 0x98f0, 78 1.1 riastrad 0x9834, 79 1.1 riastrad 0x9838, 80 1.1 riastrad 0x9870, 81 1.1 riastrad 0x9874, 82 1.1 riastrad 0x8a14, 83 1.1 riastrad 0x8b24, 84 1.1 riastrad 0x8bcc, 85 1.1 riastrad 0x8b10, 86 1.1 riastrad 0x8c30, 87 1.1 riastrad 0x8d00, 88 1.1 riastrad 0x8d04, 89 1.1 riastrad 0x8c00, 90 1.1 riastrad 0x8c04, 91 1.1 riastrad 0x8c10, 92 1.1 riastrad 0x8c14, 93 1.1 riastrad 0x8d8c, 94 1.1 riastrad 0x8cf0, 95 1.1 riastrad 0x8e38, 96 1.1 riastrad 0x9508, 97 1.1 riastrad 0x9688, 98 1.1 riastrad 0x9608, 99 1.1 riastrad 0x960c, 100 1.1 riastrad 0x9610, 101 1.1 riastrad 0x9614, 102 1.1 riastrad 0x88c4, 103 1.1 riastrad 0x8978, 104 1.1 riastrad 0x88d4, 105 1.1 riastrad 0x900c, 106 1.1 riastrad 0x9100, 107 1.1 riastrad 0x913c, 108 1.1 riastrad 0x90e8, 109 1.1 riastrad 0x9354, 110 1.1 riastrad 0xa008, 111 1.1 riastrad 0x98f8, 112 1.1 riastrad 0x9148, 113 1.1 riastrad 0x914c, 114 1.1 riastrad 0x3f94, 115 1.1 riastrad 0x98f4, 116 1.1 riastrad 0x9b7c, 117 1.1 riastrad 0x3f8c, 118 1.1 riastrad 0x8950, 119 1.1 riastrad 0x8954, 120 1.1 riastrad 0x8a18, 121 1.1 riastrad 0x8b28, 122 1.1 riastrad 0x9144, 123 1.1 riastrad 0x3f90, 124 1.1 riastrad 0x915c, 125 1.1 riastrad 0x9160, 126 1.1 riastrad 0x9178, 127 1.1 riastrad 0x917c, 128 1.1 riastrad 0x9180, 129 1.1 riastrad 0x918c, 130 1.1 riastrad 0x9190, 131 1.1 riastrad 0x9194, 132 1.1 riastrad 0x9198, 133 1.1 riastrad 0x919c, 134 1.1 riastrad 0x91a8, 135 1.1 riastrad 0x91ac, 136 1.1 riastrad 0x91b0, 137 1.1 riastrad 0x91b4, 138 1.1 riastrad 0x91b8, 139 1.1 riastrad 0x91c4, 140 1.1 riastrad 0x91c8, 141 1.1 riastrad 0x91cc, 142 1.1 riastrad 0x91d0, 143 1.1 riastrad 0x91d4, 144 1.1 riastrad 0x91e0, 145 1.1 riastrad 0x91e4, 146 1.1 riastrad 0x91ec, 147 1.1 riastrad 0x91f0, 148 1.1 riastrad 0x91f4, 149 1.1 riastrad 0x9200, 150 1.1 riastrad 0x9204, 151 1.1 riastrad 0x929c, 152 1.1 riastrad 0x8030, 153 1.1 riastrad 0x9150, 154 1.1 riastrad 0x9a60, 155 1.1 riastrad 0x920c, 156 1.1 riastrad 0x9210, 157 1.1 riastrad 0x9228, 158 1.1 riastrad 0x922c, 159 1.1 riastrad 0x9244, 160 1.1 riastrad 0x9248, 161 1.1 riastrad 0x91e8, 162 1.1 riastrad 0x9294, 163 1.1 riastrad 0x9208, 164 1.1 riastrad 0x9224, 165 1.1 riastrad 0x9240, 166 1.1 riastrad 0x9220, 167 1.1 riastrad 0x923c, 168 1.1 riastrad 0x9258, 169 1.1 riastrad 0x9744, 170 1.1 riastrad 0xa200, 171 1.1 riastrad 0xa204, 172 1.1 riastrad 0xa208, 173 1.1 riastrad 0xa20c, 174 1.1 riastrad 0x8d58, 175 1.1 riastrad 0x9030, 176 1.1 riastrad 0x9034, 177 1.1 riastrad 0x9038, 178 1.1 riastrad 0x903c, 179 1.1 riastrad 0x9040, 180 1.1 riastrad 0x9654, 181 1.1 riastrad 0x897c, 182 1.1 riastrad 0xa210, 183 1.1 riastrad 0xa214, 184 1.1 riastrad 0x9868, 185 1.1 riastrad 0xa02c, 186 1.1 riastrad 0x9664, 187 1.1 riastrad 0x9698, 188 1.1 riastrad 0x949c, 189 1.1 riastrad 0x8e10, 190 1.1 riastrad 0x8e18, 191 1.1 riastrad 0x8c50, 192 1.1 riastrad 0x8c58, 193 1.1 riastrad 0x8c60, 194 1.1 riastrad 0x8c68, 195 1.1 riastrad 0x89b4, 196 1.1 riastrad 0x9830, 197 1.1 riastrad 0x802c, 198 1.1 riastrad }; 199 1.1 riastrad 200 1.1 riastrad extern bool evergreen_is_display_hung(struct radeon_device *rdev); 201 1.1 riastrad extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 202 1.1 riastrad extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 203 1.1 riastrad extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 204 1.1 riastrad extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev); 205 1.1 riastrad extern void evergreen_mc_program(struct radeon_device *rdev); 206 1.1 riastrad extern void evergreen_irq_suspend(struct radeon_device *rdev); 207 1.1 riastrad extern int evergreen_mc_init(struct radeon_device *rdev); 208 1.1 riastrad extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); 209 1.1 riastrad extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev); 210 1.1 riastrad extern void evergreen_program_aspm(struct radeon_device *rdev); 211 1.1 riastrad extern void sumo_rlc_fini(struct radeon_device *rdev); 212 1.1 riastrad extern int sumo_rlc_init(struct radeon_device *rdev); 213 1.1 riastrad extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev); 214 1.1 riastrad 215 1.1 riastrad /* Firmware Names */ 216 1.1 riastrad MODULE_FIRMWARE("radeon/BARTS_pfp.bin"); 217 1.1 riastrad MODULE_FIRMWARE("radeon/BARTS_me.bin"); 218 1.1 riastrad MODULE_FIRMWARE("radeon/BARTS_mc.bin"); 219 1.1 riastrad MODULE_FIRMWARE("radeon/BARTS_smc.bin"); 220 1.1 riastrad MODULE_FIRMWARE("radeon/BTC_rlc.bin"); 221 1.1 riastrad MODULE_FIRMWARE("radeon/TURKS_pfp.bin"); 222 1.1 riastrad MODULE_FIRMWARE("radeon/TURKS_me.bin"); 223 1.1 riastrad MODULE_FIRMWARE("radeon/TURKS_mc.bin"); 224 1.1 riastrad MODULE_FIRMWARE("radeon/TURKS_smc.bin"); 225 1.1 riastrad MODULE_FIRMWARE("radeon/CAICOS_pfp.bin"); 226 1.1 riastrad MODULE_FIRMWARE("radeon/CAICOS_me.bin"); 227 1.1 riastrad MODULE_FIRMWARE("radeon/CAICOS_mc.bin"); 228 1.1 riastrad MODULE_FIRMWARE("radeon/CAICOS_smc.bin"); 229 1.1 riastrad MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin"); 230 1.1 riastrad MODULE_FIRMWARE("radeon/CAYMAN_me.bin"); 231 1.1 riastrad MODULE_FIRMWARE("radeon/CAYMAN_mc.bin"); 232 1.1 riastrad MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin"); 233 1.1 riastrad MODULE_FIRMWARE("radeon/CAYMAN_smc.bin"); 234 1.1 riastrad MODULE_FIRMWARE("radeon/ARUBA_pfp.bin"); 235 1.1 riastrad MODULE_FIRMWARE("radeon/ARUBA_me.bin"); 236 1.1 riastrad MODULE_FIRMWARE("radeon/ARUBA_rlc.bin"); 237 1.1 riastrad 238 1.1 riastrad 239 1.1 riastrad static const u32 cayman_golden_registers2[] = 240 1.1 riastrad { 241 1.1 riastrad 0x3e5c, 0xffffffff, 0x00000000, 242 1.1 riastrad 0x3e48, 0xffffffff, 0x00000000, 243 1.1 riastrad 0x3e4c, 0xffffffff, 0x00000000, 244 1.1 riastrad 0x3e64, 0xffffffff, 0x00000000, 245 1.1 riastrad 0x3e50, 0xffffffff, 0x00000000, 246 1.1 riastrad 0x3e60, 0xffffffff, 0x00000000 247 1.1 riastrad }; 248 1.1 riastrad 249 1.1 riastrad static const u32 cayman_golden_registers[] = 250 1.1 riastrad { 251 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 252 1.1 riastrad 0x5e78, 0x8f311ff1, 0x001000f0, 253 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 254 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 255 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 256 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 257 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 258 1.1 riastrad 0xbd4, 0x70073777, 0x00011003, 259 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 260 1.1 riastrad 0xd0b8, 0x73773777, 0x02011003, 261 1.1 riastrad 0x5bc0, 0x00200000, 0x50100000, 262 1.1 riastrad 0x98f8, 0x33773777, 0x02011003, 263 1.1 riastrad 0x98fc, 0xffffffff, 0x76541032, 264 1.1 riastrad 0x7030, 0x31000311, 0x00000011, 265 1.1 riastrad 0x2f48, 0x33773777, 0x42010001, 266 1.1 riastrad 0x6b28, 0x00000010, 0x00000012, 267 1.1 riastrad 0x7728, 0x00000010, 0x00000012, 268 1.1 riastrad 0x10328, 0x00000010, 0x00000012, 269 1.1 riastrad 0x10f28, 0x00000010, 0x00000012, 270 1.1 riastrad 0x11b28, 0x00000010, 0x00000012, 271 1.1 riastrad 0x12728, 0x00000010, 0x00000012, 272 1.1 riastrad 0x240c, 0x000007ff, 0x00000000, 273 1.1 riastrad 0x8a14, 0xf000001f, 0x00000007, 274 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 275 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 276 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 277 1.1 riastrad 0x10c, 0x00000001, 0x00010003, 278 1.1 riastrad 0xa02c, 0xffffffff, 0x0000009b, 279 1.1 riastrad 0x913c, 0x0000010f, 0x01000100, 280 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 281 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 282 1.1 riastrad 0x9508, 0x3700001f, 0x00000002, 283 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 284 1.1 riastrad 0x88c4, 0x001f3ae3, 0x00000082, 285 1.1 riastrad 0x88d0, 0xffffffff, 0x0f40df40, 286 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 287 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 288 1.1 riastrad }; 289 1.1 riastrad 290 1.1 riastrad static const u32 dvst_golden_registers2[] = 291 1.1 riastrad { 292 1.1 riastrad 0x8f8, 0xffffffff, 0, 293 1.1 riastrad 0x8fc, 0x00380000, 0, 294 1.1 riastrad 0x8f8, 0xffffffff, 1, 295 1.1 riastrad 0x8fc, 0x0e000000, 0 296 1.1 riastrad }; 297 1.1 riastrad 298 1.1 riastrad static const u32 dvst_golden_registers[] = 299 1.1 riastrad { 300 1.1 riastrad 0x690, 0x3fff3fff, 0x20c00033, 301 1.1 riastrad 0x918c, 0x0fff0fff, 0x00010006, 302 1.1 riastrad 0x91a8, 0x0fff0fff, 0x00010006, 303 1.1 riastrad 0x9150, 0xffffdfff, 0x6e944040, 304 1.1 riastrad 0x917c, 0x0fff0fff, 0x00030002, 305 1.1 riastrad 0x9198, 0x0fff0fff, 0x00030002, 306 1.1 riastrad 0x915c, 0x0fff0fff, 0x00010000, 307 1.1 riastrad 0x3f90, 0xffff0001, 0xff000000, 308 1.1 riastrad 0x9178, 0x0fff0fff, 0x00070000, 309 1.1 riastrad 0x9194, 0x0fff0fff, 0x00070000, 310 1.1 riastrad 0x9148, 0xffff0001, 0xff000000, 311 1.1 riastrad 0x9190, 0x0fff0fff, 0x00090008, 312 1.1 riastrad 0x91ac, 0x0fff0fff, 0x00090008, 313 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 314 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 315 1.1 riastrad 0x929c, 0x00000fff, 0x00000001, 316 1.1 riastrad 0x55e4, 0xff607fff, 0xfc000100, 317 1.1 riastrad 0x8a18, 0xff000fff, 0x00000100, 318 1.1 riastrad 0x8b28, 0xff000fff, 0x00000100, 319 1.1 riastrad 0x9144, 0xfffc0fff, 0x00000100, 320 1.1 riastrad 0x6ed8, 0x00010101, 0x00010000, 321 1.1 riastrad 0x9830, 0xffffffff, 0x00000000, 322 1.1 riastrad 0x9834, 0xf00fffff, 0x00000400, 323 1.1 riastrad 0x9838, 0xfffffffe, 0x00000000, 324 1.1 riastrad 0xd0c0, 0xff000fff, 0x00000100, 325 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 326 1.1 riastrad 0xd0b8, 0x73773777, 0x12010001, 327 1.1 riastrad 0x5bb0, 0x000000f0, 0x00000070, 328 1.1 riastrad 0x98f8, 0x73773777, 0x12010001, 329 1.1 riastrad 0x98fc, 0xffffffff, 0x00000010, 330 1.1 riastrad 0x9b7c, 0x00ff0000, 0x00fc0000, 331 1.1 riastrad 0x8030, 0x00001f0f, 0x0000100a, 332 1.1 riastrad 0x2f48, 0x73773777, 0x12010001, 333 1.1 riastrad 0x2408, 0x00030000, 0x000c007f, 334 1.1 riastrad 0x8a14, 0xf000003f, 0x00000007, 335 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 336 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 337 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 338 1.1 riastrad 0x4d8, 0x00000fff, 0x00000100, 339 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 340 1.1 riastrad 0x913c, 0xffff03ff, 0x01000100, 341 1.1 riastrad 0x8c00, 0x000000ff, 0x00000003, 342 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 343 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00410, 344 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 345 1.1 riastrad 0x9508, 0xf700071f, 0x00000002, 346 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 347 1.1 riastrad 0x20ef8, 0x01ff01ff, 0x00000002, 348 1.1 riastrad 0x20e98, 0xfffffbff, 0x00200000, 349 1.1 riastrad 0x2015c, 0xffffffff, 0x00000f40, 350 1.1 riastrad 0x88c4, 0x001f3ae3, 0x00000082, 351 1.1 riastrad 0x8978, 0x3fffffff, 0x04050140, 352 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 353 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 354 1.1 riastrad }; 355 1.1 riastrad 356 1.1 riastrad static const u32 scrapper_golden_registers[] = 357 1.1 riastrad { 358 1.1 riastrad 0x690, 0x3fff3fff, 0x20c00033, 359 1.1 riastrad 0x918c, 0x0fff0fff, 0x00010006, 360 1.1 riastrad 0x918c, 0x0fff0fff, 0x00010006, 361 1.1 riastrad 0x91a8, 0x0fff0fff, 0x00010006, 362 1.1 riastrad 0x91a8, 0x0fff0fff, 0x00010006, 363 1.1 riastrad 0x9150, 0xffffdfff, 0x6e944040, 364 1.1 riastrad 0x9150, 0xffffdfff, 0x6e944040, 365 1.1 riastrad 0x917c, 0x0fff0fff, 0x00030002, 366 1.1 riastrad 0x917c, 0x0fff0fff, 0x00030002, 367 1.1 riastrad 0x9198, 0x0fff0fff, 0x00030002, 368 1.1 riastrad 0x9198, 0x0fff0fff, 0x00030002, 369 1.1 riastrad 0x915c, 0x0fff0fff, 0x00010000, 370 1.1 riastrad 0x915c, 0x0fff0fff, 0x00010000, 371 1.1 riastrad 0x3f90, 0xffff0001, 0xff000000, 372 1.1 riastrad 0x3f90, 0xffff0001, 0xff000000, 373 1.1 riastrad 0x9178, 0x0fff0fff, 0x00070000, 374 1.1 riastrad 0x9178, 0x0fff0fff, 0x00070000, 375 1.1 riastrad 0x9194, 0x0fff0fff, 0x00070000, 376 1.1 riastrad 0x9194, 0x0fff0fff, 0x00070000, 377 1.1 riastrad 0x9148, 0xffff0001, 0xff000000, 378 1.1 riastrad 0x9148, 0xffff0001, 0xff000000, 379 1.1 riastrad 0x9190, 0x0fff0fff, 0x00090008, 380 1.1 riastrad 0x9190, 0x0fff0fff, 0x00090008, 381 1.1 riastrad 0x91ac, 0x0fff0fff, 0x00090008, 382 1.1 riastrad 0x91ac, 0x0fff0fff, 0x00090008, 383 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 384 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 385 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 386 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 387 1.1 riastrad 0x929c, 0x00000fff, 0x00000001, 388 1.1 riastrad 0x929c, 0x00000fff, 0x00000001, 389 1.1 riastrad 0x55e4, 0xff607fff, 0xfc000100, 390 1.1 riastrad 0x8a18, 0xff000fff, 0x00000100, 391 1.1 riastrad 0x8a18, 0xff000fff, 0x00000100, 392 1.1 riastrad 0x8b28, 0xff000fff, 0x00000100, 393 1.1 riastrad 0x8b28, 0xff000fff, 0x00000100, 394 1.1 riastrad 0x9144, 0xfffc0fff, 0x00000100, 395 1.1 riastrad 0x9144, 0xfffc0fff, 0x00000100, 396 1.1 riastrad 0x6ed8, 0x00010101, 0x00010000, 397 1.1 riastrad 0x9830, 0xffffffff, 0x00000000, 398 1.1 riastrad 0x9830, 0xffffffff, 0x00000000, 399 1.1 riastrad 0x9834, 0xf00fffff, 0x00000400, 400 1.1 riastrad 0x9834, 0xf00fffff, 0x00000400, 401 1.1 riastrad 0x9838, 0xfffffffe, 0x00000000, 402 1.1 riastrad 0x9838, 0xfffffffe, 0x00000000, 403 1.1 riastrad 0xd0c0, 0xff000fff, 0x00000100, 404 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 405 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 406 1.1 riastrad 0xd0b8, 0x73773777, 0x12010001, 407 1.1 riastrad 0xd0b8, 0x73773777, 0x12010001, 408 1.1 riastrad 0x5bb0, 0x000000f0, 0x00000070, 409 1.1 riastrad 0x98f8, 0x73773777, 0x12010001, 410 1.1 riastrad 0x98f8, 0x73773777, 0x12010001, 411 1.1 riastrad 0x98fc, 0xffffffff, 0x00000010, 412 1.1 riastrad 0x98fc, 0xffffffff, 0x00000010, 413 1.1 riastrad 0x9b7c, 0x00ff0000, 0x00fc0000, 414 1.1 riastrad 0x9b7c, 0x00ff0000, 0x00fc0000, 415 1.1 riastrad 0x8030, 0x00001f0f, 0x0000100a, 416 1.1 riastrad 0x8030, 0x00001f0f, 0x0000100a, 417 1.1 riastrad 0x2f48, 0x73773777, 0x12010001, 418 1.1 riastrad 0x2f48, 0x73773777, 0x12010001, 419 1.1 riastrad 0x2408, 0x00030000, 0x000c007f, 420 1.1 riastrad 0x8a14, 0xf000003f, 0x00000007, 421 1.1 riastrad 0x8a14, 0xf000003f, 0x00000007, 422 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 423 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 424 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 425 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 426 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 427 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 428 1.1 riastrad 0x4d8, 0x00000fff, 0x00000100, 429 1.1 riastrad 0x4d8, 0x00000fff, 0x00000100, 430 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 431 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 432 1.1 riastrad 0x913c, 0xffff03ff, 0x01000100, 433 1.1 riastrad 0x913c, 0xffff03ff, 0x01000100, 434 1.1 riastrad 0x90e8, 0x001fffff, 0x010400c0, 435 1.1 riastrad 0x8c00, 0x000000ff, 0x00000003, 436 1.1 riastrad 0x8c00, 0x000000ff, 0x00000003, 437 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 438 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 439 1.1 riastrad 0x8c30, 0x0000000f, 0x00040005, 440 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00410, 441 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00410, 442 1.1 riastrad 0x900c, 0x00ffffff, 0x0017071f, 443 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 444 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 445 1.1 riastrad 0x9508, 0xf700071f, 0x00000002, 446 1.1 riastrad 0x9508, 0xf700071f, 0x00000002, 447 1.1 riastrad 0x9688, 0x00300000, 0x0017000f, 448 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 449 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 450 1.1 riastrad 0x20ef8, 0x01ff01ff, 0x00000002, 451 1.1 riastrad 0x20e98, 0xfffffbff, 0x00200000, 452 1.1 riastrad 0x2015c, 0xffffffff, 0x00000f40, 453 1.1 riastrad 0x88c4, 0x001f3ae3, 0x00000082, 454 1.1 riastrad 0x88c4, 0x001f3ae3, 0x00000082, 455 1.1 riastrad 0x8978, 0x3fffffff, 0x04050140, 456 1.1 riastrad 0x8978, 0x3fffffff, 0x04050140, 457 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 458 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 459 1.1 riastrad 0x8974, 0xffffffff, 0x00000000, 460 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 461 1.1 riastrad }; 462 1.1 riastrad 463 1.1 riastrad static void ni_init_golden_registers(struct radeon_device *rdev) 464 1.1 riastrad { 465 1.1 riastrad switch (rdev->family) { 466 1.1 riastrad case CHIP_CAYMAN: 467 1.1 riastrad radeon_program_register_sequence(rdev, 468 1.1 riastrad cayman_golden_registers, 469 1.1 riastrad (const u32)ARRAY_SIZE(cayman_golden_registers)); 470 1.1 riastrad radeon_program_register_sequence(rdev, 471 1.1 riastrad cayman_golden_registers2, 472 1.1 riastrad (const u32)ARRAY_SIZE(cayman_golden_registers2)); 473 1.1 riastrad break; 474 1.1 riastrad case CHIP_ARUBA: 475 1.1 riastrad if ((rdev->pdev->device == 0x9900) || 476 1.1 riastrad (rdev->pdev->device == 0x9901) || 477 1.1 riastrad (rdev->pdev->device == 0x9903) || 478 1.1 riastrad (rdev->pdev->device == 0x9904) || 479 1.1 riastrad (rdev->pdev->device == 0x9905) || 480 1.1 riastrad (rdev->pdev->device == 0x9906) || 481 1.1 riastrad (rdev->pdev->device == 0x9907) || 482 1.1 riastrad (rdev->pdev->device == 0x9908) || 483 1.1 riastrad (rdev->pdev->device == 0x9909) || 484 1.1 riastrad (rdev->pdev->device == 0x990A) || 485 1.1 riastrad (rdev->pdev->device == 0x990B) || 486 1.1 riastrad (rdev->pdev->device == 0x990C) || 487 1.1 riastrad (rdev->pdev->device == 0x990D) || 488 1.1 riastrad (rdev->pdev->device == 0x990E) || 489 1.1 riastrad (rdev->pdev->device == 0x990F) || 490 1.1 riastrad (rdev->pdev->device == 0x9910) || 491 1.1 riastrad (rdev->pdev->device == 0x9913) || 492 1.1 riastrad (rdev->pdev->device == 0x9917) || 493 1.1 riastrad (rdev->pdev->device == 0x9918)) { 494 1.1 riastrad radeon_program_register_sequence(rdev, 495 1.1 riastrad dvst_golden_registers, 496 1.1 riastrad (const u32)ARRAY_SIZE(dvst_golden_registers)); 497 1.1 riastrad radeon_program_register_sequence(rdev, 498 1.1 riastrad dvst_golden_registers2, 499 1.1 riastrad (const u32)ARRAY_SIZE(dvst_golden_registers2)); 500 1.1 riastrad } else { 501 1.1 riastrad radeon_program_register_sequence(rdev, 502 1.1 riastrad scrapper_golden_registers, 503 1.1 riastrad (const u32)ARRAY_SIZE(scrapper_golden_registers)); 504 1.1 riastrad radeon_program_register_sequence(rdev, 505 1.1 riastrad dvst_golden_registers2, 506 1.1 riastrad (const u32)ARRAY_SIZE(dvst_golden_registers2)); 507 1.1 riastrad } 508 1.1 riastrad break; 509 1.1 riastrad default: 510 1.1 riastrad break; 511 1.1 riastrad } 512 1.1 riastrad } 513 1.1 riastrad 514 1.1 riastrad #define BTC_IO_MC_REGS_SIZE 29 515 1.1 riastrad 516 1.1 riastrad static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 517 1.1 riastrad {0x00000077, 0xff010100}, 518 1.1 riastrad {0x00000078, 0x00000000}, 519 1.1 riastrad {0x00000079, 0x00001434}, 520 1.1 riastrad {0x0000007a, 0xcc08ec08}, 521 1.1 riastrad {0x0000007b, 0x00040000}, 522 1.1 riastrad {0x0000007c, 0x000080c0}, 523 1.1 riastrad {0x0000007d, 0x09000000}, 524 1.1 riastrad {0x0000007e, 0x00210404}, 525 1.1 riastrad {0x00000081, 0x08a8e800}, 526 1.1 riastrad {0x00000082, 0x00030444}, 527 1.1 riastrad {0x00000083, 0x00000000}, 528 1.1 riastrad {0x00000085, 0x00000001}, 529 1.1 riastrad {0x00000086, 0x00000002}, 530 1.1 riastrad {0x00000087, 0x48490000}, 531 1.1 riastrad {0x00000088, 0x20244647}, 532 1.1 riastrad {0x00000089, 0x00000005}, 533 1.1 riastrad {0x0000008b, 0x66030000}, 534 1.1 riastrad {0x0000008c, 0x00006603}, 535 1.1 riastrad {0x0000008d, 0x00000100}, 536 1.1 riastrad {0x0000008f, 0x00001c0a}, 537 1.1 riastrad {0x00000090, 0xff000001}, 538 1.1 riastrad {0x00000094, 0x00101101}, 539 1.1 riastrad {0x00000095, 0x00000fff}, 540 1.1 riastrad {0x00000096, 0x00116fff}, 541 1.1 riastrad {0x00000097, 0x60010000}, 542 1.1 riastrad {0x00000098, 0x10010000}, 543 1.1 riastrad {0x00000099, 0x00006000}, 544 1.1 riastrad {0x0000009a, 0x00001000}, 545 1.1 riastrad {0x0000009f, 0x00946a00} 546 1.1 riastrad }; 547 1.1 riastrad 548 1.1 riastrad static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 549 1.1 riastrad {0x00000077, 0xff010100}, 550 1.1 riastrad {0x00000078, 0x00000000}, 551 1.1 riastrad {0x00000079, 0x00001434}, 552 1.1 riastrad {0x0000007a, 0xcc08ec08}, 553 1.1 riastrad {0x0000007b, 0x00040000}, 554 1.1 riastrad {0x0000007c, 0x000080c0}, 555 1.1 riastrad {0x0000007d, 0x09000000}, 556 1.1 riastrad {0x0000007e, 0x00210404}, 557 1.1 riastrad {0x00000081, 0x08a8e800}, 558 1.1 riastrad {0x00000082, 0x00030444}, 559 1.1 riastrad {0x00000083, 0x00000000}, 560 1.1 riastrad {0x00000085, 0x00000001}, 561 1.1 riastrad {0x00000086, 0x00000002}, 562 1.1 riastrad {0x00000087, 0x48490000}, 563 1.1 riastrad {0x00000088, 0x20244647}, 564 1.1 riastrad {0x00000089, 0x00000005}, 565 1.1 riastrad {0x0000008b, 0x66030000}, 566 1.1 riastrad {0x0000008c, 0x00006603}, 567 1.1 riastrad {0x0000008d, 0x00000100}, 568 1.1 riastrad {0x0000008f, 0x00001c0a}, 569 1.1 riastrad {0x00000090, 0xff000001}, 570 1.1 riastrad {0x00000094, 0x00101101}, 571 1.1 riastrad {0x00000095, 0x00000fff}, 572 1.1 riastrad {0x00000096, 0x00116fff}, 573 1.1 riastrad {0x00000097, 0x60010000}, 574 1.1 riastrad {0x00000098, 0x10010000}, 575 1.1 riastrad {0x00000099, 0x00006000}, 576 1.1 riastrad {0x0000009a, 0x00001000}, 577 1.1 riastrad {0x0000009f, 0x00936a00} 578 1.1 riastrad }; 579 1.1 riastrad 580 1.1 riastrad static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 581 1.1 riastrad {0x00000077, 0xff010100}, 582 1.1 riastrad {0x00000078, 0x00000000}, 583 1.1 riastrad {0x00000079, 0x00001434}, 584 1.1 riastrad {0x0000007a, 0xcc08ec08}, 585 1.1 riastrad {0x0000007b, 0x00040000}, 586 1.1 riastrad {0x0000007c, 0x000080c0}, 587 1.1 riastrad {0x0000007d, 0x09000000}, 588 1.1 riastrad {0x0000007e, 0x00210404}, 589 1.1 riastrad {0x00000081, 0x08a8e800}, 590 1.1 riastrad {0x00000082, 0x00030444}, 591 1.1 riastrad {0x00000083, 0x00000000}, 592 1.1 riastrad {0x00000085, 0x00000001}, 593 1.1 riastrad {0x00000086, 0x00000002}, 594 1.1 riastrad {0x00000087, 0x48490000}, 595 1.1 riastrad {0x00000088, 0x20244647}, 596 1.1 riastrad {0x00000089, 0x00000005}, 597 1.1 riastrad {0x0000008b, 0x66030000}, 598 1.1 riastrad {0x0000008c, 0x00006603}, 599 1.1 riastrad {0x0000008d, 0x00000100}, 600 1.1 riastrad {0x0000008f, 0x00001c0a}, 601 1.1 riastrad {0x00000090, 0xff000001}, 602 1.1 riastrad {0x00000094, 0x00101101}, 603 1.1 riastrad {0x00000095, 0x00000fff}, 604 1.1 riastrad {0x00000096, 0x00116fff}, 605 1.1 riastrad {0x00000097, 0x60010000}, 606 1.1 riastrad {0x00000098, 0x10010000}, 607 1.1 riastrad {0x00000099, 0x00006000}, 608 1.1 riastrad {0x0000009a, 0x00001000}, 609 1.1 riastrad {0x0000009f, 0x00916a00} 610 1.1 riastrad }; 611 1.1 riastrad 612 1.1 riastrad static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 613 1.1 riastrad {0x00000077, 0xff010100}, 614 1.1 riastrad {0x00000078, 0x00000000}, 615 1.1 riastrad {0x00000079, 0x00001434}, 616 1.1 riastrad {0x0000007a, 0xcc08ec08}, 617 1.1 riastrad {0x0000007b, 0x00040000}, 618 1.1 riastrad {0x0000007c, 0x000080c0}, 619 1.1 riastrad {0x0000007d, 0x09000000}, 620 1.1 riastrad {0x0000007e, 0x00210404}, 621 1.1 riastrad {0x00000081, 0x08a8e800}, 622 1.1 riastrad {0x00000082, 0x00030444}, 623 1.1 riastrad {0x00000083, 0x00000000}, 624 1.1 riastrad {0x00000085, 0x00000001}, 625 1.1 riastrad {0x00000086, 0x00000002}, 626 1.1 riastrad {0x00000087, 0x48490000}, 627 1.1 riastrad {0x00000088, 0x20244647}, 628 1.1 riastrad {0x00000089, 0x00000005}, 629 1.1 riastrad {0x0000008b, 0x66030000}, 630 1.1 riastrad {0x0000008c, 0x00006603}, 631 1.1 riastrad {0x0000008d, 0x00000100}, 632 1.1 riastrad {0x0000008f, 0x00001c0a}, 633 1.1 riastrad {0x00000090, 0xff000001}, 634 1.1 riastrad {0x00000094, 0x00101101}, 635 1.1 riastrad {0x00000095, 0x00000fff}, 636 1.1 riastrad {0x00000096, 0x00116fff}, 637 1.1 riastrad {0x00000097, 0x60010000}, 638 1.1 riastrad {0x00000098, 0x10010000}, 639 1.1 riastrad {0x00000099, 0x00006000}, 640 1.1 riastrad {0x0000009a, 0x00001000}, 641 1.1 riastrad {0x0000009f, 0x00976b00} 642 1.1 riastrad }; 643 1.1 riastrad 644 1.1 riastrad int ni_mc_load_microcode(struct radeon_device *rdev) 645 1.1 riastrad { 646 1.1 riastrad const __be32 *fw_data; 647 1.1 riastrad u32 mem_type, running, blackout = 0; 648 1.1 riastrad const u32 *io_mc_regs; 649 1.1 riastrad int i, ucode_size, regs_size; 650 1.1 riastrad 651 1.1 riastrad if (!rdev->mc_fw) 652 1.1 riastrad return -EINVAL; 653 1.1 riastrad 654 1.1 riastrad switch (rdev->family) { 655 1.1 riastrad case CHIP_BARTS: 656 1.1 riastrad io_mc_regs = &barts_io_mc_regs[0][0]; 657 1.1 riastrad ucode_size = BTC_MC_UCODE_SIZE; 658 1.1 riastrad regs_size = BTC_IO_MC_REGS_SIZE; 659 1.1 riastrad break; 660 1.1 riastrad case CHIP_TURKS: 661 1.1 riastrad io_mc_regs = &turks_io_mc_regs[0][0]; 662 1.1 riastrad ucode_size = BTC_MC_UCODE_SIZE; 663 1.1 riastrad regs_size = BTC_IO_MC_REGS_SIZE; 664 1.1 riastrad break; 665 1.1 riastrad case CHIP_CAICOS: 666 1.1 riastrad default: 667 1.1 riastrad io_mc_regs = &caicos_io_mc_regs[0][0]; 668 1.1 riastrad ucode_size = BTC_MC_UCODE_SIZE; 669 1.1 riastrad regs_size = BTC_IO_MC_REGS_SIZE; 670 1.1 riastrad break; 671 1.1 riastrad case CHIP_CAYMAN: 672 1.1 riastrad io_mc_regs = &cayman_io_mc_regs[0][0]; 673 1.1 riastrad ucode_size = CAYMAN_MC_UCODE_SIZE; 674 1.1 riastrad regs_size = BTC_IO_MC_REGS_SIZE; 675 1.1 riastrad break; 676 1.1 riastrad } 677 1.1 riastrad 678 1.1 riastrad mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT; 679 1.1 riastrad running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; 680 1.1 riastrad 681 1.1 riastrad if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) { 682 1.1 riastrad if (running) { 683 1.1 riastrad blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); 684 1.1 riastrad WREG32(MC_SHARED_BLACKOUT_CNTL, 1); 685 1.1 riastrad } 686 1.1 riastrad 687 1.1 riastrad /* reset the engine and set to writable */ 688 1.1 riastrad WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 689 1.1 riastrad WREG32(MC_SEQ_SUP_CNTL, 0x00000010); 690 1.1 riastrad 691 1.1 riastrad /* load mc io regs */ 692 1.1 riastrad for (i = 0; i < regs_size; i++) { 693 1.1 riastrad WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 694 1.1 riastrad WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 695 1.1 riastrad } 696 1.1 riastrad /* load the MC ucode */ 697 1.1 riastrad fw_data = (const __be32 *)rdev->mc_fw->data; 698 1.1 riastrad for (i = 0; i < ucode_size; i++) 699 1.1 riastrad WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 700 1.1 riastrad 701 1.1 riastrad /* put the engine back into the active state */ 702 1.1 riastrad WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 703 1.1 riastrad WREG32(MC_SEQ_SUP_CNTL, 0x00000004); 704 1.1 riastrad WREG32(MC_SEQ_SUP_CNTL, 0x00000001); 705 1.1 riastrad 706 1.1 riastrad /* wait for training to complete */ 707 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 708 1.1 riastrad if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD) 709 1.1 riastrad break; 710 1.1 riastrad udelay(1); 711 1.1 riastrad } 712 1.1 riastrad 713 1.1 riastrad if (running) 714 1.1 riastrad WREG32(MC_SHARED_BLACKOUT_CNTL, blackout); 715 1.1 riastrad } 716 1.1 riastrad 717 1.1 riastrad return 0; 718 1.1 riastrad } 719 1.1 riastrad 720 1.1 riastrad int ni_init_microcode(struct radeon_device *rdev) 721 1.1 riastrad { 722 1.1 riastrad const char *chip_name; 723 1.1 riastrad const char *rlc_chip_name; 724 1.1 riastrad size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size; 725 1.1 riastrad size_t smc_req_size = 0; 726 1.1 riastrad char fw_name[30]; 727 1.1 riastrad int err; 728 1.1 riastrad 729 1.1 riastrad DRM_DEBUG("\n"); 730 1.1 riastrad 731 1.1 riastrad switch (rdev->family) { 732 1.1 riastrad case CHIP_BARTS: 733 1.1 riastrad chip_name = "BARTS"; 734 1.1 riastrad rlc_chip_name = "BTC"; 735 1.1 riastrad pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 736 1.1 riastrad me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 737 1.1 riastrad rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 738 1.1 riastrad mc_req_size = BTC_MC_UCODE_SIZE * 4; 739 1.1 riastrad smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4); 740 1.1 riastrad break; 741 1.1 riastrad case CHIP_TURKS: 742 1.1 riastrad chip_name = "TURKS"; 743 1.1 riastrad rlc_chip_name = "BTC"; 744 1.1 riastrad pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 745 1.1 riastrad me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 746 1.1 riastrad rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 747 1.1 riastrad mc_req_size = BTC_MC_UCODE_SIZE * 4; 748 1.1 riastrad smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4); 749 1.1 riastrad break; 750 1.1 riastrad case CHIP_CAICOS: 751 1.1 riastrad chip_name = "CAICOS"; 752 1.1 riastrad rlc_chip_name = "BTC"; 753 1.1 riastrad pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 754 1.1 riastrad me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 755 1.1 riastrad rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 756 1.1 riastrad mc_req_size = BTC_MC_UCODE_SIZE * 4; 757 1.1 riastrad smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4); 758 1.1 riastrad break; 759 1.1 riastrad case CHIP_CAYMAN: 760 1.1 riastrad chip_name = "CAYMAN"; 761 1.1 riastrad rlc_chip_name = "CAYMAN"; 762 1.1 riastrad pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 763 1.1 riastrad me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 764 1.1 riastrad rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4; 765 1.1 riastrad mc_req_size = CAYMAN_MC_UCODE_SIZE * 4; 766 1.1 riastrad smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4); 767 1.1 riastrad break; 768 1.1 riastrad case CHIP_ARUBA: 769 1.1 riastrad chip_name = "ARUBA"; 770 1.1 riastrad rlc_chip_name = "ARUBA"; 771 1.1 riastrad /* pfp/me same size as CAYMAN */ 772 1.1 riastrad pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 773 1.1 riastrad me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 774 1.1 riastrad rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4; 775 1.1 riastrad mc_req_size = 0; 776 1.1 riastrad break; 777 1.1 riastrad default: BUG(); 778 1.1 riastrad } 779 1.1 riastrad 780 1.1 riastrad DRM_INFO("Loading %s Microcode\n", chip_name); 781 1.1 riastrad 782 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 783 1.1 riastrad err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 784 1.1 riastrad if (err) 785 1.1 riastrad goto out; 786 1.1 riastrad if (rdev->pfp_fw->size != pfp_req_size) { 787 1.3 riastrad pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n", 788 1.1 riastrad rdev->pfp_fw->size, fw_name); 789 1.1 riastrad err = -EINVAL; 790 1.1 riastrad goto out; 791 1.1 riastrad } 792 1.1 riastrad 793 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 794 1.1 riastrad err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 795 1.1 riastrad if (err) 796 1.1 riastrad goto out; 797 1.1 riastrad if (rdev->me_fw->size != me_req_size) { 798 1.3 riastrad pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n", 799 1.1 riastrad rdev->me_fw->size, fw_name); 800 1.1 riastrad err = -EINVAL; 801 1.1 riastrad } 802 1.1 riastrad 803 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); 804 1.1 riastrad err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 805 1.1 riastrad if (err) 806 1.1 riastrad goto out; 807 1.1 riastrad if (rdev->rlc_fw->size != rlc_req_size) { 808 1.3 riastrad pr_err("ni_rlc: Bogus length %zu in firmware \"%s\"\n", 809 1.1 riastrad rdev->rlc_fw->size, fw_name); 810 1.1 riastrad err = -EINVAL; 811 1.1 riastrad } 812 1.1 riastrad 813 1.1 riastrad /* no MC ucode on TN */ 814 1.1 riastrad if (!(rdev->flags & RADEON_IS_IGP)) { 815 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 816 1.1 riastrad err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 817 1.1 riastrad if (err) 818 1.1 riastrad goto out; 819 1.1 riastrad if (rdev->mc_fw->size != mc_req_size) { 820 1.3 riastrad pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n", 821 1.1 riastrad rdev->mc_fw->size, fw_name); 822 1.1 riastrad err = -EINVAL; 823 1.1 riastrad } 824 1.1 riastrad } 825 1.1 riastrad 826 1.1 riastrad if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) { 827 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 828 1.1 riastrad err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 829 1.1 riastrad if (err) { 830 1.3 riastrad pr_err("smc: error loading firmware \"%s\"\n", fw_name); 831 1.1 riastrad release_firmware(rdev->smc_fw); 832 1.1 riastrad rdev->smc_fw = NULL; 833 1.1 riastrad err = 0; 834 1.1 riastrad } else if (rdev->smc_fw->size != smc_req_size) { 835 1.3 riastrad pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n", 836 1.1 riastrad rdev->mc_fw->size, fw_name); 837 1.1 riastrad err = -EINVAL; 838 1.1 riastrad } 839 1.1 riastrad } 840 1.1 riastrad 841 1.1 riastrad out: 842 1.1 riastrad if (err) { 843 1.1 riastrad if (err != -EINVAL) 844 1.3 riastrad pr_err("ni_cp: Failed to load firmware \"%s\"\n", 845 1.1 riastrad fw_name); 846 1.1 riastrad release_firmware(rdev->pfp_fw); 847 1.1 riastrad rdev->pfp_fw = NULL; 848 1.1 riastrad release_firmware(rdev->me_fw); 849 1.1 riastrad rdev->me_fw = NULL; 850 1.1 riastrad release_firmware(rdev->rlc_fw); 851 1.1 riastrad rdev->rlc_fw = NULL; 852 1.1 riastrad release_firmware(rdev->mc_fw); 853 1.1 riastrad rdev->mc_fw = NULL; 854 1.1 riastrad } 855 1.1 riastrad return err; 856 1.1 riastrad } 857 1.1 riastrad 858 1.1 riastrad /** 859 1.1 riastrad * cayman_get_allowed_info_register - fetch the register for the info ioctl 860 1.1 riastrad * 861 1.1 riastrad * @rdev: radeon_device pointer 862 1.1 riastrad * @reg: register offset in bytes 863 1.1 riastrad * @val: register value 864 1.1 riastrad * 865 1.1 riastrad * Returns 0 for success or -EINVAL for an invalid register 866 1.1 riastrad * 867 1.1 riastrad */ 868 1.1 riastrad int cayman_get_allowed_info_register(struct radeon_device *rdev, 869 1.1 riastrad u32 reg, u32 *val) 870 1.1 riastrad { 871 1.1 riastrad switch (reg) { 872 1.1 riastrad case GRBM_STATUS: 873 1.1 riastrad case GRBM_STATUS_SE0: 874 1.1 riastrad case GRBM_STATUS_SE1: 875 1.1 riastrad case SRBM_STATUS: 876 1.1 riastrad case SRBM_STATUS2: 877 1.1 riastrad case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET): 878 1.1 riastrad case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET): 879 1.1 riastrad case UVD_STATUS: 880 1.1 riastrad *val = RREG32(reg); 881 1.1 riastrad return 0; 882 1.1 riastrad default: 883 1.1 riastrad return -EINVAL; 884 1.1 riastrad } 885 1.1 riastrad } 886 1.1 riastrad 887 1.1 riastrad int tn_get_temp(struct radeon_device *rdev) 888 1.1 riastrad { 889 1.1 riastrad u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff; 890 1.1 riastrad int actual_temp = (temp / 8) - 49; 891 1.1 riastrad 892 1.1 riastrad return actual_temp * 1000; 893 1.1 riastrad } 894 1.1 riastrad 895 1.1 riastrad /* 896 1.1 riastrad * Core functions 897 1.1 riastrad */ 898 1.1 riastrad static void cayman_gpu_init(struct radeon_device *rdev) 899 1.1 riastrad { 900 1.1 riastrad u32 gb_addr_config = 0; 901 1.1 riastrad u32 mc_shared_chmap __unused, mc_arb_ramcfg; 902 1.1 riastrad u32 cgts_tcc_disable; 903 1.1 riastrad u32 sx_debug_1; 904 1.1 riastrad u32 smx_dc_ctl0; 905 1.1 riastrad u32 cgts_sm_ctrl_reg; 906 1.1 riastrad u32 hdp_host_path_cntl; 907 1.1 riastrad u32 tmp; 908 1.1 riastrad u32 disabled_rb_mask; 909 1.1 riastrad int i, j; 910 1.1 riastrad 911 1.1 riastrad switch (rdev->family) { 912 1.1 riastrad case CHIP_CAYMAN: 913 1.1 riastrad rdev->config.cayman.max_shader_engines = 2; 914 1.1 riastrad rdev->config.cayman.max_pipes_per_simd = 4; 915 1.1 riastrad rdev->config.cayman.max_tile_pipes = 8; 916 1.1 riastrad rdev->config.cayman.max_simds_per_se = 12; 917 1.1 riastrad rdev->config.cayman.max_backends_per_se = 4; 918 1.1 riastrad rdev->config.cayman.max_texture_channel_caches = 8; 919 1.1 riastrad rdev->config.cayman.max_gprs = 256; 920 1.1 riastrad rdev->config.cayman.max_threads = 256; 921 1.1 riastrad rdev->config.cayman.max_gs_threads = 32; 922 1.1 riastrad rdev->config.cayman.max_stack_entries = 512; 923 1.1 riastrad rdev->config.cayman.sx_num_of_sets = 8; 924 1.1 riastrad rdev->config.cayman.sx_max_export_size = 256; 925 1.1 riastrad rdev->config.cayman.sx_max_export_pos_size = 64; 926 1.1 riastrad rdev->config.cayman.sx_max_export_smx_size = 192; 927 1.1 riastrad rdev->config.cayman.max_hw_contexts = 8; 928 1.1 riastrad rdev->config.cayman.sq_num_cf_insts = 2; 929 1.1 riastrad 930 1.1 riastrad rdev->config.cayman.sc_prim_fifo_size = 0x100; 931 1.1 riastrad rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 932 1.1 riastrad rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 933 1.1 riastrad gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN; 934 1.1 riastrad break; 935 1.1 riastrad case CHIP_ARUBA: 936 1.1 riastrad default: 937 1.1 riastrad rdev->config.cayman.max_shader_engines = 1; 938 1.1 riastrad rdev->config.cayman.max_pipes_per_simd = 4; 939 1.1 riastrad rdev->config.cayman.max_tile_pipes = 2; 940 1.1 riastrad if ((rdev->pdev->device == 0x9900) || 941 1.1 riastrad (rdev->pdev->device == 0x9901) || 942 1.1 riastrad (rdev->pdev->device == 0x9905) || 943 1.1 riastrad (rdev->pdev->device == 0x9906) || 944 1.1 riastrad (rdev->pdev->device == 0x9907) || 945 1.1 riastrad (rdev->pdev->device == 0x9908) || 946 1.1 riastrad (rdev->pdev->device == 0x9909) || 947 1.1 riastrad (rdev->pdev->device == 0x990B) || 948 1.1 riastrad (rdev->pdev->device == 0x990C) || 949 1.1 riastrad (rdev->pdev->device == 0x990F) || 950 1.1 riastrad (rdev->pdev->device == 0x9910) || 951 1.1 riastrad (rdev->pdev->device == 0x9917) || 952 1.1 riastrad (rdev->pdev->device == 0x9999) || 953 1.1 riastrad (rdev->pdev->device == 0x999C)) { 954 1.1 riastrad rdev->config.cayman.max_simds_per_se = 6; 955 1.1 riastrad rdev->config.cayman.max_backends_per_se = 2; 956 1.1 riastrad rdev->config.cayman.max_hw_contexts = 8; 957 1.1 riastrad rdev->config.cayman.sx_max_export_size = 256; 958 1.1 riastrad rdev->config.cayman.sx_max_export_pos_size = 64; 959 1.1 riastrad rdev->config.cayman.sx_max_export_smx_size = 192; 960 1.1 riastrad } else if ((rdev->pdev->device == 0x9903) || 961 1.1 riastrad (rdev->pdev->device == 0x9904) || 962 1.1 riastrad (rdev->pdev->device == 0x990A) || 963 1.1 riastrad (rdev->pdev->device == 0x990D) || 964 1.1 riastrad (rdev->pdev->device == 0x990E) || 965 1.1 riastrad (rdev->pdev->device == 0x9913) || 966 1.1 riastrad (rdev->pdev->device == 0x9918) || 967 1.1 riastrad (rdev->pdev->device == 0x999D)) { 968 1.1 riastrad rdev->config.cayman.max_simds_per_se = 4; 969 1.1 riastrad rdev->config.cayman.max_backends_per_se = 2; 970 1.1 riastrad rdev->config.cayman.max_hw_contexts = 8; 971 1.1 riastrad rdev->config.cayman.sx_max_export_size = 256; 972 1.1 riastrad rdev->config.cayman.sx_max_export_pos_size = 64; 973 1.1 riastrad rdev->config.cayman.sx_max_export_smx_size = 192; 974 1.1 riastrad } else if ((rdev->pdev->device == 0x9919) || 975 1.1 riastrad (rdev->pdev->device == 0x9990) || 976 1.1 riastrad (rdev->pdev->device == 0x9991) || 977 1.1 riastrad (rdev->pdev->device == 0x9994) || 978 1.1 riastrad (rdev->pdev->device == 0x9995) || 979 1.1 riastrad (rdev->pdev->device == 0x9996) || 980 1.1 riastrad (rdev->pdev->device == 0x999A) || 981 1.1 riastrad (rdev->pdev->device == 0x99A0)) { 982 1.1 riastrad rdev->config.cayman.max_simds_per_se = 3; 983 1.1 riastrad rdev->config.cayman.max_backends_per_se = 1; 984 1.1 riastrad rdev->config.cayman.max_hw_contexts = 4; 985 1.1 riastrad rdev->config.cayman.sx_max_export_size = 128; 986 1.1 riastrad rdev->config.cayman.sx_max_export_pos_size = 32; 987 1.1 riastrad rdev->config.cayman.sx_max_export_smx_size = 96; 988 1.1 riastrad } else { 989 1.1 riastrad rdev->config.cayman.max_simds_per_se = 2; 990 1.1 riastrad rdev->config.cayman.max_backends_per_se = 1; 991 1.1 riastrad rdev->config.cayman.max_hw_contexts = 4; 992 1.1 riastrad rdev->config.cayman.sx_max_export_size = 128; 993 1.1 riastrad rdev->config.cayman.sx_max_export_pos_size = 32; 994 1.1 riastrad rdev->config.cayman.sx_max_export_smx_size = 96; 995 1.1 riastrad } 996 1.1 riastrad rdev->config.cayman.max_texture_channel_caches = 2; 997 1.1 riastrad rdev->config.cayman.max_gprs = 256; 998 1.1 riastrad rdev->config.cayman.max_threads = 256; 999 1.1 riastrad rdev->config.cayman.max_gs_threads = 32; 1000 1.1 riastrad rdev->config.cayman.max_stack_entries = 512; 1001 1.1 riastrad rdev->config.cayman.sx_num_of_sets = 8; 1002 1.1 riastrad rdev->config.cayman.sq_num_cf_insts = 2; 1003 1.1 riastrad 1004 1.1 riastrad rdev->config.cayman.sc_prim_fifo_size = 0x40; 1005 1.1 riastrad rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 1006 1.1 riastrad rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 1007 1.1 riastrad gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN; 1008 1.1 riastrad break; 1009 1.1 riastrad } 1010 1.1 riastrad 1011 1.1 riastrad /* Initialize HDP */ 1012 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 1013 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 1014 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 1015 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 1016 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 1017 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 1018 1.1 riastrad } 1019 1.1 riastrad 1020 1.1 riastrad WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 1021 1.1 riastrad WREG32(SRBM_INT_CNTL, 0x1); 1022 1.1 riastrad WREG32(SRBM_INT_ACK, 0x1); 1023 1.1 riastrad 1024 1.1 riastrad evergreen_fix_pci_max_read_req_size(rdev); 1025 1.1 riastrad 1026 1.1 riastrad mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 1027 1.1 riastrad mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 1028 1.1 riastrad 1029 1.1 riastrad tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; 1030 1.1 riastrad rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; 1031 1.1 riastrad if (rdev->config.cayman.mem_row_size_in_kb > 4) 1032 1.1 riastrad rdev->config.cayman.mem_row_size_in_kb = 4; 1033 1.1 riastrad /* XXX use MC settings? */ 1034 1.1 riastrad rdev->config.cayman.shader_engine_tile_size = 32; 1035 1.1 riastrad rdev->config.cayman.num_gpus = 1; 1036 1.1 riastrad rdev->config.cayman.multi_gpu_tile_size = 64; 1037 1.1 riastrad 1038 1.1 riastrad tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; 1039 1.1 riastrad rdev->config.cayman.num_tile_pipes = (1 << tmp); 1040 1.1 riastrad tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; 1041 1.1 riastrad rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256; 1042 1.1 riastrad tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT; 1043 1.1 riastrad rdev->config.cayman.num_shader_engines = tmp + 1; 1044 1.1 riastrad tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT; 1045 1.1 riastrad rdev->config.cayman.num_gpus = tmp + 1; 1046 1.1 riastrad tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT; 1047 1.1 riastrad rdev->config.cayman.multi_gpu_tile_size = 1 << tmp; 1048 1.1 riastrad tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; 1049 1.1 riastrad rdev->config.cayman.mem_row_size_in_kb = 1 << tmp; 1050 1.1 riastrad 1051 1.1 riastrad 1052 1.1 riastrad /* setup tiling info dword. gb_addr_config is not adequate since it does 1053 1.1 riastrad * not have bank info, so create a custom tiling dword. 1054 1.1 riastrad * bits 3:0 num_pipes 1055 1.1 riastrad * bits 7:4 num_banks 1056 1.1 riastrad * bits 11:8 group_size 1057 1.1 riastrad * bits 15:12 row_size 1058 1.1 riastrad */ 1059 1.1 riastrad rdev->config.cayman.tile_config = 0; 1060 1.1 riastrad switch (rdev->config.cayman.num_tile_pipes) { 1061 1.1 riastrad case 1: 1062 1.1 riastrad default: 1063 1.1 riastrad rdev->config.cayman.tile_config |= (0 << 0); 1064 1.1 riastrad break; 1065 1.1 riastrad case 2: 1066 1.1 riastrad rdev->config.cayman.tile_config |= (1 << 0); 1067 1.1 riastrad break; 1068 1.1 riastrad case 4: 1069 1.1 riastrad rdev->config.cayman.tile_config |= (2 << 0); 1070 1.1 riastrad break; 1071 1.1 riastrad case 8: 1072 1.1 riastrad rdev->config.cayman.tile_config |= (3 << 0); 1073 1.1 riastrad break; 1074 1.1 riastrad } 1075 1.1 riastrad 1076 1.1 riastrad /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ 1077 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 1078 1.1 riastrad rdev->config.cayman.tile_config |= 1 << 4; 1079 1.1 riastrad else { 1080 1.1 riastrad switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { 1081 1.1 riastrad case 0: /* four banks */ 1082 1.1 riastrad rdev->config.cayman.tile_config |= 0 << 4; 1083 1.1 riastrad break; 1084 1.1 riastrad case 1: /* eight banks */ 1085 1.1 riastrad rdev->config.cayman.tile_config |= 1 << 4; 1086 1.1 riastrad break; 1087 1.1 riastrad case 2: /* sixteen banks */ 1088 1.1 riastrad default: 1089 1.1 riastrad rdev->config.cayman.tile_config |= 2 << 4; 1090 1.1 riastrad break; 1091 1.1 riastrad } 1092 1.1 riastrad } 1093 1.1 riastrad rdev->config.cayman.tile_config |= 1094 1.1 riastrad ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; 1095 1.1 riastrad rdev->config.cayman.tile_config |= 1096 1.1 riastrad ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; 1097 1.1 riastrad 1098 1.1 riastrad tmp = 0; 1099 1.1 riastrad for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) { 1100 1.1 riastrad u32 rb_disable_bitmap; 1101 1.1 riastrad 1102 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1103 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1104 1.1 riastrad rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; 1105 1.1 riastrad tmp <<= 4; 1106 1.1 riastrad tmp |= rb_disable_bitmap; 1107 1.1 riastrad } 1108 1.1 riastrad /* enabled rb are just the one not disabled :) */ 1109 1.1 riastrad disabled_rb_mask = tmp; 1110 1.1 riastrad tmp = 0; 1111 1.1 riastrad for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 1112 1.1 riastrad tmp |= (1 << i); 1113 1.1 riastrad /* if all the backends are disabled, fix it up here */ 1114 1.1 riastrad if ((disabled_rb_mask & tmp) == tmp) { 1115 1.1 riastrad for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 1116 1.1 riastrad disabled_rb_mask &= ~(1 << i); 1117 1.1 riastrad } 1118 1.1 riastrad 1119 1.1 riastrad for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) { 1120 1.1 riastrad u32 simd_disable_bitmap; 1121 1.1 riastrad 1122 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1123 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1124 1.1 riastrad simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; 1125 1.1 riastrad simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se; 1126 1.1 riastrad tmp <<= 16; 1127 1.1 riastrad tmp |= simd_disable_bitmap; 1128 1.1 riastrad } 1129 1.1 riastrad rdev->config.cayman.active_simds = hweight32(~tmp); 1130 1.1 riastrad 1131 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1132 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1133 1.1 riastrad 1134 1.1 riastrad WREG32(GB_ADDR_CONFIG, gb_addr_config); 1135 1.1 riastrad WREG32(DMIF_ADDR_CONFIG, gb_addr_config); 1136 1.1 riastrad if (ASIC_IS_DCE6(rdev)) 1137 1.1 riastrad WREG32(DMIF_ADDR_CALC, gb_addr_config); 1138 1.1 riastrad WREG32(HDP_ADDR_CONFIG, gb_addr_config); 1139 1.1 riastrad WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config); 1140 1.1 riastrad WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config); 1141 1.1 riastrad WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config); 1142 1.1 riastrad WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config); 1143 1.1 riastrad WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config); 1144 1.1 riastrad 1145 1.1 riastrad if ((rdev->config.cayman.max_backends_per_se == 1) && 1146 1.1 riastrad (rdev->flags & RADEON_IS_IGP)) { 1147 1.1 riastrad if ((disabled_rb_mask & 3) == 2) { 1148 1.1 riastrad /* RB1 disabled, RB0 enabled */ 1149 1.1 riastrad tmp = 0x00000000; 1150 1.1 riastrad } else { 1151 1.1 riastrad /* RB0 disabled, RB1 enabled */ 1152 1.1 riastrad tmp = 0x11111111; 1153 1.1 riastrad } 1154 1.1 riastrad } else { 1155 1.1 riastrad tmp = gb_addr_config & NUM_PIPES_MASK; 1156 1.1 riastrad tmp = r6xx_remap_render_backend(rdev, tmp, 1157 1.1 riastrad rdev->config.cayman.max_backends_per_se * 1158 1.1 riastrad rdev->config.cayman.max_shader_engines, 1159 1.1 riastrad CAYMAN_MAX_BACKENDS, disabled_rb_mask); 1160 1.1 riastrad } 1161 1.3 riastrad rdev->config.cayman.backend_map = tmp; 1162 1.1 riastrad WREG32(GB_BACKEND_MAP, tmp); 1163 1.1 riastrad 1164 1.1 riastrad cgts_tcc_disable = 0xffff0000; 1165 1.1 riastrad for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++) 1166 1.1 riastrad cgts_tcc_disable &= ~(1 << (16 + i)); 1167 1.1 riastrad WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); 1168 1.1 riastrad WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable); 1169 1.1 riastrad WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable); 1170 1.1 riastrad WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); 1171 1.1 riastrad 1172 1.1 riastrad /* reprogram the shader complex */ 1173 1.1 riastrad cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG); 1174 1.1 riastrad for (i = 0; i < 16; i++) 1175 1.1 riastrad WREG32(CGTS_SM_CTRL_REG, OVERRIDE); 1176 1.1 riastrad WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg); 1177 1.1 riastrad 1178 1.1 riastrad /* set HW defaults for 3D engine */ 1179 1.1 riastrad WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60)); 1180 1.1 riastrad 1181 1.1 riastrad sx_debug_1 = RREG32(SX_DEBUG_1); 1182 1.1 riastrad sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 1183 1.1 riastrad WREG32(SX_DEBUG_1, sx_debug_1); 1184 1.1 riastrad 1185 1.1 riastrad smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 1186 1.1 riastrad smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff); 1187 1.1 riastrad smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets); 1188 1.1 riastrad WREG32(SMX_DC_CTL0, smx_dc_ctl0); 1189 1.1 riastrad 1190 1.1 riastrad WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE); 1191 1.1 riastrad 1192 1.1 riastrad /* need to be explicitly zero-ed */ 1193 1.1 riastrad WREG32(VGT_OFFCHIP_LDS_BASE, 0); 1194 1.1 riastrad WREG32(SQ_LSTMP_RING_BASE, 0); 1195 1.1 riastrad WREG32(SQ_HSTMP_RING_BASE, 0); 1196 1.1 riastrad WREG32(SQ_ESTMP_RING_BASE, 0); 1197 1.1 riastrad WREG32(SQ_GSTMP_RING_BASE, 0); 1198 1.1 riastrad WREG32(SQ_VSTMP_RING_BASE, 0); 1199 1.1 riastrad WREG32(SQ_PSTMP_RING_BASE, 0); 1200 1.1 riastrad 1201 1.1 riastrad WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO); 1202 1.1 riastrad 1203 1.1 riastrad WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) | 1204 1.1 riastrad POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) | 1205 1.1 riastrad SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1))); 1206 1.1 riastrad 1207 1.1 riastrad WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) | 1208 1.1 riastrad SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) | 1209 1.1 riastrad SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size))); 1210 1.1 riastrad 1211 1.1 riastrad 1212 1.1 riastrad WREG32(VGT_NUM_INSTANCES, 1); 1213 1.1 riastrad 1214 1.1 riastrad WREG32(CP_PERFMON_CNTL, 0); 1215 1.1 riastrad 1216 1.1 riastrad WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) | 1217 1.1 riastrad FETCH_FIFO_HIWATER(0x4) | 1218 1.1 riastrad DONE_FIFO_HIWATER(0xe0) | 1219 1.1 riastrad ALU_UPDATE_FIFO_HIWATER(0x8))); 1220 1.1 riastrad 1221 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4)); 1222 1.1 riastrad WREG32(SQ_CONFIG, (VC_ENABLE | 1223 1.1 riastrad EXPORT_SRC_C | 1224 1.1 riastrad GFX_PRIO(0) | 1225 1.1 riastrad CS1_PRIO(0) | 1226 1.1 riastrad CS2_PRIO(1))); 1227 1.1 riastrad WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE); 1228 1.1 riastrad 1229 1.1 riastrad WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 1230 1.1 riastrad FORCE_EOV_MAX_REZ_CNT(255))); 1231 1.1 riastrad 1232 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) | 1233 1.1 riastrad AUTO_INVLD_EN(ES_AND_GS_AUTO)); 1234 1.1 riastrad 1235 1.1 riastrad WREG32(VGT_GS_VERTEX_REUSE, 16); 1236 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 1237 1.1 riastrad 1238 1.1 riastrad WREG32(CB_PERF_CTR0_SEL_0, 0); 1239 1.1 riastrad WREG32(CB_PERF_CTR0_SEL_1, 0); 1240 1.1 riastrad WREG32(CB_PERF_CTR1_SEL_0, 0); 1241 1.1 riastrad WREG32(CB_PERF_CTR1_SEL_1, 0); 1242 1.1 riastrad WREG32(CB_PERF_CTR2_SEL_0, 0); 1243 1.1 riastrad WREG32(CB_PERF_CTR2_SEL_1, 0); 1244 1.1 riastrad WREG32(CB_PERF_CTR3_SEL_0, 0); 1245 1.1 riastrad WREG32(CB_PERF_CTR3_SEL_1, 0); 1246 1.1 riastrad 1247 1.1 riastrad tmp = RREG32(HDP_MISC_CNTL); 1248 1.1 riastrad tmp |= HDP_FLUSH_INVALIDATE_CACHE; 1249 1.1 riastrad WREG32(HDP_MISC_CNTL, tmp); 1250 1.1 riastrad 1251 1.1 riastrad hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 1252 1.1 riastrad WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 1253 1.1 riastrad 1254 1.1 riastrad WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3)); 1255 1.1 riastrad 1256 1.1 riastrad udelay(50); 1257 1.1 riastrad 1258 1.1 riastrad /* set clockgating golden values on TN */ 1259 1.1 riastrad if (rdev->family == CHIP_ARUBA) { 1260 1.1 riastrad tmp = RREG32_CG(CG_CGTT_LOCAL_0); 1261 1.1 riastrad tmp &= ~0x00380000; 1262 1.1 riastrad WREG32_CG(CG_CGTT_LOCAL_0, tmp); 1263 1.3 riastrad tmp = RREG32_CG(CG_CGTT_LOCAL_1); 1264 1.1 riastrad tmp &= ~0x0e000000; 1265 1.1 riastrad WREG32_CG(CG_CGTT_LOCAL_1, tmp); 1266 1.1 riastrad } 1267 1.1 riastrad } 1268 1.1 riastrad 1269 1.1 riastrad /* 1270 1.1 riastrad * GART 1271 1.1 riastrad */ 1272 1.1 riastrad void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev) 1273 1.1 riastrad { 1274 1.1 riastrad /* flush hdp cache */ 1275 1.1 riastrad WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 1276 1.1 riastrad 1277 1.1 riastrad /* bits 0-7 are the VM contexts0-7 */ 1278 1.1 riastrad WREG32(VM_INVALIDATE_REQUEST, 1); 1279 1.1 riastrad } 1280 1.1 riastrad 1281 1.1 riastrad static int cayman_pcie_gart_enable(struct radeon_device *rdev) 1282 1.1 riastrad { 1283 1.1 riastrad int i, r; 1284 1.1 riastrad 1285 1.1 riastrad if (rdev->gart.robj == NULL) { 1286 1.1 riastrad dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 1287 1.1 riastrad return -EINVAL; 1288 1.1 riastrad } 1289 1.1 riastrad r = radeon_gart_table_vram_pin(rdev); 1290 1.1 riastrad if (r) 1291 1.1 riastrad return r; 1292 1.1 riastrad /* Setup TLB control */ 1293 1.1 riastrad WREG32(MC_VM_MX_L1_TLB_CNTL, 1294 1.1 riastrad (0xA << 7) | 1295 1.1 riastrad ENABLE_L1_TLB | 1296 1.1 riastrad ENABLE_L1_FRAGMENT_PROCESSING | 1297 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1298 1.1 riastrad ENABLE_ADVANCED_DRIVER_MODEL | 1299 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 1300 1.1 riastrad /* Setup L2 cache */ 1301 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | 1302 1.1 riastrad ENABLE_L2_FRAGMENT_PROCESSING | 1303 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1304 1.1 riastrad ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 1305 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7) | 1306 1.1 riastrad CONTEXT1_IDENTITY_ACCESS_MODE(1)); 1307 1.1 riastrad WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE); 1308 1.1 riastrad WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 1309 1.1 riastrad BANK_SELECT(6) | 1310 1.1 riastrad L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 1311 1.1 riastrad /* setup context0 */ 1312 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 1313 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 1314 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 1315 1.1 riastrad WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 1316 1.1 riastrad (u32)(rdev->dummy_page.addr >> 12)); 1317 1.1 riastrad WREG32(VM_CONTEXT0_CNTL2, 0); 1318 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 1319 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 1320 1.1 riastrad 1321 1.1 riastrad WREG32(0x15D4, 0); 1322 1.1 riastrad WREG32(0x15D8, 0); 1323 1.1 riastrad WREG32(0x15DC, 0); 1324 1.1 riastrad 1325 1.1 riastrad /* empty context1-7 */ 1326 1.1 riastrad /* Assign the pt base to something valid for now; the pts used for 1327 1.1 riastrad * the VMs are determined by the application and setup and assigned 1328 1.1 riastrad * on the fly in the vm part of radeon_gart.c 1329 1.1 riastrad */ 1330 1.1 riastrad for (i = 1; i < 8; i++) { 1331 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0); 1332 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), 1333 1.1 riastrad rdev->vm_manager.max_pfn - 1); 1334 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), 1335 1.1 riastrad rdev->vm_manager.saved_table_addr[i]); 1336 1.1 riastrad } 1337 1.1 riastrad 1338 1.1 riastrad /* enable context1-7 */ 1339 1.1 riastrad WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR, 1340 1.1 riastrad (u32)(rdev->dummy_page.addr >> 12)); 1341 1.1 riastrad WREG32(VM_CONTEXT1_CNTL2, 4); 1342 1.1 riastrad WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 1343 1.1 riastrad PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) | 1344 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1345 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 1346 1.1 riastrad DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1347 1.1 riastrad DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT | 1348 1.1 riastrad PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT | 1349 1.1 riastrad PDE0_PROTECTION_FAULT_ENABLE_DEFAULT | 1350 1.1 riastrad VALID_PROTECTION_FAULT_ENABLE_INTERRUPT | 1351 1.1 riastrad VALID_PROTECTION_FAULT_ENABLE_DEFAULT | 1352 1.1 riastrad READ_PROTECTION_FAULT_ENABLE_INTERRUPT | 1353 1.1 riastrad READ_PROTECTION_FAULT_ENABLE_DEFAULT | 1354 1.1 riastrad WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1355 1.1 riastrad WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); 1356 1.1 riastrad 1357 1.1 riastrad cayman_pcie_gart_tlb_flush(rdev); 1358 1.1 riastrad DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1359 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20), 1360 1.1 riastrad (unsigned long long)rdev->gart.table_addr); 1361 1.1 riastrad rdev->gart.ready = true; 1362 1.1 riastrad return 0; 1363 1.1 riastrad } 1364 1.1 riastrad 1365 1.1 riastrad static void cayman_pcie_gart_disable(struct radeon_device *rdev) 1366 1.1 riastrad { 1367 1.1 riastrad unsigned i; 1368 1.1 riastrad 1369 1.1 riastrad for (i = 1; i < 8; ++i) { 1370 1.1 riastrad rdev->vm_manager.saved_table_addr[i] = RREG32( 1371 1.1 riastrad VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2)); 1372 1.1 riastrad } 1373 1.1 riastrad 1374 1.1 riastrad /* Disable all tables */ 1375 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, 0); 1376 1.1 riastrad WREG32(VM_CONTEXT1_CNTL, 0); 1377 1.1 riastrad /* Setup TLB control */ 1378 1.1 riastrad WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING | 1379 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1380 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 1381 1.1 riastrad /* Setup L2 cache */ 1382 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1383 1.1 riastrad ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 1384 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7) | 1385 1.1 riastrad CONTEXT1_IDENTITY_ACCESS_MODE(1)); 1386 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 1387 1.1 riastrad WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 1388 1.1 riastrad L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 1389 1.1 riastrad radeon_gart_table_vram_unpin(rdev); 1390 1.1 riastrad } 1391 1.1 riastrad 1392 1.1 riastrad static void cayman_pcie_gart_fini(struct radeon_device *rdev) 1393 1.1 riastrad { 1394 1.1 riastrad cayman_pcie_gart_disable(rdev); 1395 1.1 riastrad radeon_gart_table_vram_free(rdev); 1396 1.1 riastrad radeon_gart_fini(rdev); 1397 1.1 riastrad } 1398 1.1 riastrad 1399 1.1 riastrad void cayman_cp_int_cntl_setup(struct radeon_device *rdev, 1400 1.1 riastrad int ring, u32 cp_int_cntl) 1401 1.1 riastrad { 1402 1.1 riastrad WREG32(SRBM_GFX_CNTL, RINGID(ring)); 1403 1.1 riastrad WREG32(CP_INT_CNTL, cp_int_cntl); 1404 1.1 riastrad } 1405 1.1 riastrad 1406 1.1 riastrad /* 1407 1.1 riastrad * CP. 1408 1.1 riastrad */ 1409 1.1 riastrad void cayman_fence_ring_emit(struct radeon_device *rdev, 1410 1.1 riastrad struct radeon_fence *fence) 1411 1.1 riastrad { 1412 1.1 riastrad struct radeon_ring *ring = &rdev->ring[fence->ring]; 1413 1.1 riastrad u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 1414 1.1 riastrad u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 1415 1.1 riastrad PACKET3_SH_ACTION_ENA; 1416 1.1 riastrad 1417 1.1 riastrad /* flush read cache over gart for this vmid */ 1418 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 1419 1.1 riastrad radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 1420 1.1 riastrad radeon_ring_write(ring, 0xFFFFFFFF); 1421 1.1 riastrad radeon_ring_write(ring, 0); 1422 1.1 riastrad radeon_ring_write(ring, 10); /* poll interval */ 1423 1.1 riastrad /* EVENT_WRITE_EOP - flush caches, send int */ 1424 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 1425 1.1 riastrad radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 1426 1.1 riastrad radeon_ring_write(ring, lower_32_bits(addr)); 1427 1.1 riastrad radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 1428 1.1 riastrad radeon_ring_write(ring, fence->seq); 1429 1.1 riastrad radeon_ring_write(ring, 0); 1430 1.1 riastrad } 1431 1.1 riastrad 1432 1.1 riastrad void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 1433 1.1 riastrad { 1434 1.1 riastrad struct radeon_ring *ring = &rdev->ring[ib->ring]; 1435 1.1 riastrad unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0; 1436 1.1 riastrad u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 1437 1.1 riastrad PACKET3_SH_ACTION_ENA; 1438 1.1 riastrad 1439 1.1 riastrad /* set to DX10/11 mode */ 1440 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); 1441 1.1 riastrad radeon_ring_write(ring, 1); 1442 1.1 riastrad 1443 1.1 riastrad if (ring->rptr_save_reg) { 1444 1.1 riastrad uint32_t next_rptr = ring->wptr + 3 + 4 + 8; 1445 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 1446 1.1 riastrad radeon_ring_write(ring, ((ring->rptr_save_reg - 1447 1.1 riastrad PACKET3_SET_CONFIG_REG_START) >> 2)); 1448 1.1 riastrad radeon_ring_write(ring, next_rptr); 1449 1.1 riastrad } 1450 1.1 riastrad 1451 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 1452 1.1 riastrad radeon_ring_write(ring, 1453 1.1 riastrad #ifdef __BIG_ENDIAN 1454 1.1 riastrad (2 << 0) | 1455 1.1 riastrad #endif 1456 1.1 riastrad (ib->gpu_addr & 0xFFFFFFFC)); 1457 1.1 riastrad radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF); 1458 1.1 riastrad radeon_ring_write(ring, ib->length_dw | (vm_id << 24)); 1459 1.1 riastrad 1460 1.1 riastrad /* flush read cache over gart for this vmid */ 1461 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 1462 1.1 riastrad radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 1463 1.1 riastrad radeon_ring_write(ring, 0xFFFFFFFF); 1464 1.1 riastrad radeon_ring_write(ring, 0); 1465 1.1 riastrad radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */ 1466 1.1 riastrad } 1467 1.1 riastrad 1468 1.1 riastrad static void cayman_cp_enable(struct radeon_device *rdev, bool enable) 1469 1.1 riastrad { 1470 1.1 riastrad if (enable) 1471 1.1 riastrad WREG32(CP_ME_CNTL, 0); 1472 1.1 riastrad else { 1473 1.1 riastrad if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 1474 1.1 riastrad radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 1475 1.1 riastrad WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 1476 1.1 riastrad WREG32(SCRATCH_UMSK, 0); 1477 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1478 1.1 riastrad } 1479 1.1 riastrad } 1480 1.1 riastrad 1481 1.1 riastrad u32 cayman_gfx_get_rptr(struct radeon_device *rdev, 1482 1.1 riastrad struct radeon_ring *ring) 1483 1.1 riastrad { 1484 1.1 riastrad u32 rptr; 1485 1.1 riastrad 1486 1.1 riastrad if (rdev->wb.enabled) 1487 1.1 riastrad rptr = rdev->wb.wb[ring->rptr_offs/4]; 1488 1.1 riastrad else { 1489 1.1 riastrad if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 1490 1.1 riastrad rptr = RREG32(CP_RB0_RPTR); 1491 1.1 riastrad else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 1492 1.1 riastrad rptr = RREG32(CP_RB1_RPTR); 1493 1.1 riastrad else 1494 1.1 riastrad rptr = RREG32(CP_RB2_RPTR); 1495 1.1 riastrad } 1496 1.1 riastrad 1497 1.1 riastrad return rptr; 1498 1.1 riastrad } 1499 1.1 riastrad 1500 1.1 riastrad u32 cayman_gfx_get_wptr(struct radeon_device *rdev, 1501 1.1 riastrad struct radeon_ring *ring) 1502 1.1 riastrad { 1503 1.1 riastrad u32 wptr; 1504 1.1 riastrad 1505 1.1 riastrad if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 1506 1.1 riastrad wptr = RREG32(CP_RB0_WPTR); 1507 1.1 riastrad else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 1508 1.1 riastrad wptr = RREG32(CP_RB1_WPTR); 1509 1.1 riastrad else 1510 1.1 riastrad wptr = RREG32(CP_RB2_WPTR); 1511 1.1 riastrad 1512 1.1 riastrad return wptr; 1513 1.1 riastrad } 1514 1.1 riastrad 1515 1.1 riastrad void cayman_gfx_set_wptr(struct radeon_device *rdev, 1516 1.1 riastrad struct radeon_ring *ring) 1517 1.1 riastrad { 1518 1.1 riastrad if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) { 1519 1.1 riastrad WREG32(CP_RB0_WPTR, ring->wptr); 1520 1.1 riastrad (void)RREG32(CP_RB0_WPTR); 1521 1.1 riastrad } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) { 1522 1.1 riastrad WREG32(CP_RB1_WPTR, ring->wptr); 1523 1.1 riastrad (void)RREG32(CP_RB1_WPTR); 1524 1.1 riastrad } else { 1525 1.1 riastrad WREG32(CP_RB2_WPTR, ring->wptr); 1526 1.1 riastrad (void)RREG32(CP_RB2_WPTR); 1527 1.1 riastrad } 1528 1.1 riastrad } 1529 1.1 riastrad 1530 1.1 riastrad static int cayman_cp_load_microcode(struct radeon_device *rdev) 1531 1.1 riastrad { 1532 1.1 riastrad const __be32 *fw_data; 1533 1.1 riastrad int i; 1534 1.1 riastrad 1535 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw) 1536 1.1 riastrad return -EINVAL; 1537 1.1 riastrad 1538 1.1 riastrad cayman_cp_enable(rdev, false); 1539 1.1 riastrad 1540 1.1 riastrad fw_data = (const __be32 *)rdev->pfp_fw->data; 1541 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1542 1.1 riastrad for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++) 1543 1.1 riastrad WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 1544 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1545 1.1 riastrad 1546 1.1 riastrad fw_data = (const __be32 *)rdev->me_fw->data; 1547 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 1548 1.1 riastrad for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++) 1549 1.1 riastrad WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 1550 1.1 riastrad 1551 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1552 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 1553 1.1 riastrad WREG32(CP_ME_RAM_RADDR, 0); 1554 1.1 riastrad return 0; 1555 1.1 riastrad } 1556 1.1 riastrad 1557 1.1 riastrad static int cayman_cp_start(struct radeon_device *rdev) 1558 1.1 riastrad { 1559 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1560 1.1 riastrad int r, i; 1561 1.1 riastrad 1562 1.1 riastrad r = radeon_ring_lock(rdev, ring, 7); 1563 1.1 riastrad if (r) { 1564 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 1565 1.1 riastrad return r; 1566 1.1 riastrad } 1567 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5)); 1568 1.1 riastrad radeon_ring_write(ring, 0x1); 1569 1.1 riastrad radeon_ring_write(ring, 0x0); 1570 1.1 riastrad radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1); 1571 1.1 riastrad radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); 1572 1.1 riastrad radeon_ring_write(ring, 0); 1573 1.1 riastrad radeon_ring_write(ring, 0); 1574 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 1575 1.1 riastrad 1576 1.1 riastrad cayman_cp_enable(rdev, true); 1577 1.1 riastrad 1578 1.1 riastrad r = radeon_ring_lock(rdev, ring, cayman_default_size + 19); 1579 1.1 riastrad if (r) { 1580 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 1581 1.1 riastrad return r; 1582 1.1 riastrad } 1583 1.1 riastrad 1584 1.1 riastrad /* setup clear context state */ 1585 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 1586 1.1 riastrad radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); 1587 1.1 riastrad 1588 1.1 riastrad for (i = 0; i < cayman_default_size; i++) 1589 1.1 riastrad radeon_ring_write(ring, cayman_default_state[i]); 1590 1.1 riastrad 1591 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 1592 1.1 riastrad radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); 1593 1.1 riastrad 1594 1.1 riastrad /* set clear context state */ 1595 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0)); 1596 1.1 riastrad radeon_ring_write(ring, 0); 1597 1.1 riastrad 1598 1.1 riastrad /* SQ_VTX_BASE_VTX_LOC */ 1599 1.1 riastrad radeon_ring_write(ring, 0xc0026f00); 1600 1.1 riastrad radeon_ring_write(ring, 0x00000000); 1601 1.1 riastrad radeon_ring_write(ring, 0x00000000); 1602 1.1 riastrad radeon_ring_write(ring, 0x00000000); 1603 1.1 riastrad 1604 1.1 riastrad /* Clear consts */ 1605 1.1 riastrad radeon_ring_write(ring, 0xc0036f00); 1606 1.1 riastrad radeon_ring_write(ring, 0x00000bc4); 1607 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 1608 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 1609 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 1610 1.1 riastrad 1611 1.1 riastrad radeon_ring_write(ring, 0xc0026900); 1612 1.1 riastrad radeon_ring_write(ring, 0x00000316); 1613 1.1 riastrad radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ 1614 1.1 riastrad radeon_ring_write(ring, 0x00000010); /* */ 1615 1.1 riastrad 1616 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 1617 1.1 riastrad 1618 1.1 riastrad /* XXX init other rings */ 1619 1.1 riastrad 1620 1.1 riastrad return 0; 1621 1.1 riastrad } 1622 1.1 riastrad 1623 1.1 riastrad static void cayman_cp_fini(struct radeon_device *rdev) 1624 1.1 riastrad { 1625 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1626 1.1 riastrad cayman_cp_enable(rdev, false); 1627 1.1 riastrad radeon_ring_fini(rdev, ring); 1628 1.1 riastrad radeon_scratch_free(rdev, ring->rptr_save_reg); 1629 1.1 riastrad } 1630 1.1 riastrad 1631 1.1 riastrad static int cayman_cp_resume(struct radeon_device *rdev) 1632 1.1 riastrad { 1633 1.1 riastrad static const int ridx[] = { 1634 1.1 riastrad RADEON_RING_TYPE_GFX_INDEX, 1635 1.1 riastrad CAYMAN_RING_TYPE_CP1_INDEX, 1636 1.1 riastrad CAYMAN_RING_TYPE_CP2_INDEX 1637 1.1 riastrad }; 1638 1.1 riastrad static const unsigned cp_rb_cntl[] = { 1639 1.1 riastrad CP_RB0_CNTL, 1640 1.1 riastrad CP_RB1_CNTL, 1641 1.1 riastrad CP_RB2_CNTL, 1642 1.1 riastrad }; 1643 1.1 riastrad static const unsigned cp_rb_rptr_addr[] = { 1644 1.1 riastrad CP_RB0_RPTR_ADDR, 1645 1.1 riastrad CP_RB1_RPTR_ADDR, 1646 1.1 riastrad CP_RB2_RPTR_ADDR 1647 1.1 riastrad }; 1648 1.1 riastrad static const unsigned cp_rb_rptr_addr_hi[] = { 1649 1.1 riastrad CP_RB0_RPTR_ADDR_HI, 1650 1.1 riastrad CP_RB1_RPTR_ADDR_HI, 1651 1.1 riastrad CP_RB2_RPTR_ADDR_HI 1652 1.1 riastrad }; 1653 1.1 riastrad static const unsigned cp_rb_base[] = { 1654 1.1 riastrad CP_RB0_BASE, 1655 1.1 riastrad CP_RB1_BASE, 1656 1.1 riastrad CP_RB2_BASE 1657 1.1 riastrad }; 1658 1.1 riastrad static const unsigned cp_rb_rptr[] = { 1659 1.1 riastrad CP_RB0_RPTR, 1660 1.1 riastrad CP_RB1_RPTR, 1661 1.1 riastrad CP_RB2_RPTR 1662 1.1 riastrad }; 1663 1.1 riastrad static const unsigned cp_rb_wptr[] = { 1664 1.1 riastrad CP_RB0_WPTR, 1665 1.1 riastrad CP_RB1_WPTR, 1666 1.1 riastrad CP_RB2_WPTR 1667 1.1 riastrad }; 1668 1.1 riastrad struct radeon_ring *ring; 1669 1.1 riastrad int i, r; 1670 1.1 riastrad 1671 1.1 riastrad /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */ 1672 1.1 riastrad WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP | 1673 1.1 riastrad SOFT_RESET_PA | 1674 1.1 riastrad SOFT_RESET_SH | 1675 1.1 riastrad SOFT_RESET_VGT | 1676 1.1 riastrad SOFT_RESET_SPI | 1677 1.1 riastrad SOFT_RESET_SX)); 1678 1.1 riastrad RREG32(GRBM_SOFT_RESET); 1679 1.1 riastrad mdelay(15); 1680 1.1 riastrad WREG32(GRBM_SOFT_RESET, 0); 1681 1.1 riastrad RREG32(GRBM_SOFT_RESET); 1682 1.1 riastrad 1683 1.1 riastrad WREG32(CP_SEM_WAIT_TIMER, 0x0); 1684 1.1 riastrad WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); 1685 1.1 riastrad 1686 1.1 riastrad /* Set the write pointer delay */ 1687 1.1 riastrad WREG32(CP_RB_WPTR_DELAY, 0); 1688 1.1 riastrad 1689 1.1 riastrad WREG32(CP_DEBUG, (1 << 27)); 1690 1.1 riastrad 1691 1.1 riastrad /* set the wb address whether it's enabled or not */ 1692 1.1 riastrad WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); 1693 1.1 riastrad WREG32(SCRATCH_UMSK, 0xff); 1694 1.1 riastrad 1695 1.1 riastrad for (i = 0; i < 3; ++i) { 1696 1.1 riastrad uint32_t rb_cntl; 1697 1.1 riastrad uint64_t addr; 1698 1.1 riastrad 1699 1.1 riastrad /* Set ring buffer size */ 1700 1.1 riastrad ring = &rdev->ring[ridx[i]]; 1701 1.1 riastrad rb_cntl = order_base_2(ring->ring_size / 8); 1702 1.1 riastrad rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8; 1703 1.1 riastrad #ifdef __BIG_ENDIAN 1704 1.1 riastrad rb_cntl |= BUF_SWAP_32BIT; 1705 1.1 riastrad #endif 1706 1.1 riastrad WREG32(cp_rb_cntl[i], rb_cntl); 1707 1.1 riastrad 1708 1.1 riastrad /* set the wb address whether it's enabled or not */ 1709 1.1 riastrad addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET; 1710 1.1 riastrad WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC); 1711 1.1 riastrad WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF); 1712 1.1 riastrad } 1713 1.1 riastrad 1714 1.1 riastrad /* set the rb base addr, this causes an internal reset of ALL rings */ 1715 1.1 riastrad for (i = 0; i < 3; ++i) { 1716 1.1 riastrad ring = &rdev->ring[ridx[i]]; 1717 1.1 riastrad WREG32(cp_rb_base[i], ring->gpu_addr >> 8); 1718 1.1 riastrad } 1719 1.1 riastrad 1720 1.1 riastrad for (i = 0; i < 3; ++i) { 1721 1.1 riastrad /* Initialize the ring buffer's read and write pointers */ 1722 1.1 riastrad ring = &rdev->ring[ridx[i]]; 1723 1.1 riastrad WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); 1724 1.1 riastrad 1725 1.1 riastrad ring->wptr = 0; 1726 1.1 riastrad WREG32(cp_rb_rptr[i], 0); 1727 1.1 riastrad WREG32(cp_rb_wptr[i], ring->wptr); 1728 1.1 riastrad 1729 1.1 riastrad mdelay(1); 1730 1.1 riastrad WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA); 1731 1.1 riastrad } 1732 1.1 riastrad 1733 1.1 riastrad /* start the rings */ 1734 1.1 riastrad cayman_cp_start(rdev); 1735 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true; 1736 1.1 riastrad rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 1737 1.1 riastrad rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 1738 1.1 riastrad /* this only test cp0 */ 1739 1.1 riastrad r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); 1740 1.1 riastrad if (r) { 1741 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1742 1.1 riastrad rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 1743 1.1 riastrad rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 1744 1.1 riastrad return r; 1745 1.1 riastrad } 1746 1.1 riastrad 1747 1.1 riastrad if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 1748 1.1 riastrad radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 1749 1.1 riastrad 1750 1.1 riastrad return 0; 1751 1.1 riastrad } 1752 1.1 riastrad 1753 1.1 riastrad u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev) 1754 1.1 riastrad { 1755 1.1 riastrad u32 reset_mask = 0; 1756 1.1 riastrad u32 tmp; 1757 1.1 riastrad 1758 1.1 riastrad /* GRBM_STATUS */ 1759 1.1 riastrad tmp = RREG32(GRBM_STATUS); 1760 1.1 riastrad if (tmp & (PA_BUSY | SC_BUSY | 1761 1.1 riastrad SH_BUSY | SX_BUSY | 1762 1.1 riastrad TA_BUSY | VGT_BUSY | 1763 1.1 riastrad DB_BUSY | CB_BUSY | 1764 1.1 riastrad GDS_BUSY | SPI_BUSY | 1765 1.1 riastrad IA_BUSY | IA_BUSY_NO_DMA)) 1766 1.1 riastrad reset_mask |= RADEON_RESET_GFX; 1767 1.1 riastrad 1768 1.1 riastrad if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 1769 1.1 riastrad CP_BUSY | CP_COHERENCY_BUSY)) 1770 1.1 riastrad reset_mask |= RADEON_RESET_CP; 1771 1.1 riastrad 1772 1.1 riastrad if (tmp & GRBM_EE_BUSY) 1773 1.1 riastrad reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 1774 1.1 riastrad 1775 1.1 riastrad /* DMA_STATUS_REG 0 */ 1776 1.1 riastrad tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 1777 1.1 riastrad if (!(tmp & DMA_IDLE)) 1778 1.1 riastrad reset_mask |= RADEON_RESET_DMA; 1779 1.1 riastrad 1780 1.1 riastrad /* DMA_STATUS_REG 1 */ 1781 1.1 riastrad tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 1782 1.1 riastrad if (!(tmp & DMA_IDLE)) 1783 1.1 riastrad reset_mask |= RADEON_RESET_DMA1; 1784 1.1 riastrad 1785 1.1 riastrad /* SRBM_STATUS2 */ 1786 1.1 riastrad tmp = RREG32(SRBM_STATUS2); 1787 1.1 riastrad if (tmp & DMA_BUSY) 1788 1.1 riastrad reset_mask |= RADEON_RESET_DMA; 1789 1.1 riastrad 1790 1.1 riastrad if (tmp & DMA1_BUSY) 1791 1.1 riastrad reset_mask |= RADEON_RESET_DMA1; 1792 1.1 riastrad 1793 1.1 riastrad /* SRBM_STATUS */ 1794 1.1 riastrad tmp = RREG32(SRBM_STATUS); 1795 1.1 riastrad if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 1796 1.1 riastrad reset_mask |= RADEON_RESET_RLC; 1797 1.1 riastrad 1798 1.1 riastrad if (tmp & IH_BUSY) 1799 1.1 riastrad reset_mask |= RADEON_RESET_IH; 1800 1.1 riastrad 1801 1.1 riastrad if (tmp & SEM_BUSY) 1802 1.1 riastrad reset_mask |= RADEON_RESET_SEM; 1803 1.1 riastrad 1804 1.1 riastrad if (tmp & GRBM_RQ_PENDING) 1805 1.1 riastrad reset_mask |= RADEON_RESET_GRBM; 1806 1.1 riastrad 1807 1.1 riastrad if (tmp & VMC_BUSY) 1808 1.1 riastrad reset_mask |= RADEON_RESET_VMC; 1809 1.1 riastrad 1810 1.1 riastrad if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 1811 1.1 riastrad MCC_BUSY | MCD_BUSY)) 1812 1.1 riastrad reset_mask |= RADEON_RESET_MC; 1813 1.1 riastrad 1814 1.1 riastrad if (evergreen_is_display_hung(rdev)) 1815 1.1 riastrad reset_mask |= RADEON_RESET_DISPLAY; 1816 1.1 riastrad 1817 1.1 riastrad /* VM_L2_STATUS */ 1818 1.1 riastrad tmp = RREG32(VM_L2_STATUS); 1819 1.1 riastrad if (tmp & L2_BUSY) 1820 1.1 riastrad reset_mask |= RADEON_RESET_VMC; 1821 1.1 riastrad 1822 1.1 riastrad /* Skip MC reset as it's mostly likely not hung, just busy */ 1823 1.1 riastrad if (reset_mask & RADEON_RESET_MC) { 1824 1.1 riastrad DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask); 1825 1.1 riastrad reset_mask &= ~RADEON_RESET_MC; 1826 1.1 riastrad } 1827 1.1 riastrad 1828 1.1 riastrad return reset_mask; 1829 1.1 riastrad } 1830 1.1 riastrad 1831 1.1 riastrad static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1832 1.1 riastrad { 1833 1.1 riastrad struct evergreen_mc_save save; 1834 1.1 riastrad u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 1835 1.1 riastrad u32 tmp; 1836 1.1 riastrad 1837 1.1 riastrad if (reset_mask == 0) 1838 1.1 riastrad return; 1839 1.1 riastrad 1840 1.1 riastrad dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 1841 1.1 riastrad 1842 1.1 riastrad evergreen_print_gpu_status_regs(rdev); 1843 1.1 riastrad dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", 1844 1.1 riastrad RREG32(0x14F8)); 1845 1.1 riastrad dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", 1846 1.1 riastrad RREG32(0x14D8)); 1847 1.1 riastrad dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 1848 1.1 riastrad RREG32(0x14FC)); 1849 1.1 riastrad dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 1850 1.1 riastrad RREG32(0x14DC)); 1851 1.1 riastrad 1852 1.1 riastrad /* Disable CP parsing/prefetching */ 1853 1.1 riastrad WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 1854 1.1 riastrad 1855 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) { 1856 1.1 riastrad /* dma0 */ 1857 1.1 riastrad tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 1858 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 1859 1.1 riastrad WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 1860 1.1 riastrad } 1861 1.1 riastrad 1862 1.1 riastrad if (reset_mask & RADEON_RESET_DMA1) { 1863 1.1 riastrad /* dma1 */ 1864 1.1 riastrad tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 1865 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 1866 1.1 riastrad WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 1867 1.1 riastrad } 1868 1.1 riastrad 1869 1.1 riastrad udelay(50); 1870 1.1 riastrad 1871 1.1 riastrad evergreen_mc_stop(rdev, &save); 1872 1.1 riastrad if (evergreen_mc_wait_for_idle(rdev)) { 1873 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1874 1.1 riastrad } 1875 1.1 riastrad 1876 1.1 riastrad if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 1877 1.1 riastrad grbm_soft_reset = SOFT_RESET_CB | 1878 1.1 riastrad SOFT_RESET_DB | 1879 1.1 riastrad SOFT_RESET_GDS | 1880 1.1 riastrad SOFT_RESET_PA | 1881 1.1 riastrad SOFT_RESET_SC | 1882 1.1 riastrad SOFT_RESET_SPI | 1883 1.1 riastrad SOFT_RESET_SH | 1884 1.1 riastrad SOFT_RESET_SX | 1885 1.1 riastrad SOFT_RESET_TC | 1886 1.1 riastrad SOFT_RESET_TA | 1887 1.1 riastrad SOFT_RESET_VGT | 1888 1.1 riastrad SOFT_RESET_IA; 1889 1.1 riastrad } 1890 1.1 riastrad 1891 1.1 riastrad if (reset_mask & RADEON_RESET_CP) { 1892 1.1 riastrad grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT; 1893 1.1 riastrad 1894 1.1 riastrad srbm_soft_reset |= SOFT_RESET_GRBM; 1895 1.1 riastrad } 1896 1.1 riastrad 1897 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) 1898 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DMA; 1899 1.1 riastrad 1900 1.1 riastrad if (reset_mask & RADEON_RESET_DMA1) 1901 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DMA1; 1902 1.1 riastrad 1903 1.1 riastrad if (reset_mask & RADEON_RESET_DISPLAY) 1904 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DC; 1905 1.1 riastrad 1906 1.1 riastrad if (reset_mask & RADEON_RESET_RLC) 1907 1.1 riastrad srbm_soft_reset |= SOFT_RESET_RLC; 1908 1.1 riastrad 1909 1.1 riastrad if (reset_mask & RADEON_RESET_SEM) 1910 1.1 riastrad srbm_soft_reset |= SOFT_RESET_SEM; 1911 1.1 riastrad 1912 1.1 riastrad if (reset_mask & RADEON_RESET_IH) 1913 1.1 riastrad srbm_soft_reset |= SOFT_RESET_IH; 1914 1.1 riastrad 1915 1.1 riastrad if (reset_mask & RADEON_RESET_GRBM) 1916 1.1 riastrad srbm_soft_reset |= SOFT_RESET_GRBM; 1917 1.1 riastrad 1918 1.1 riastrad if (reset_mask & RADEON_RESET_VMC) 1919 1.1 riastrad srbm_soft_reset |= SOFT_RESET_VMC; 1920 1.1 riastrad 1921 1.1 riastrad if (!(rdev->flags & RADEON_IS_IGP)) { 1922 1.1 riastrad if (reset_mask & RADEON_RESET_MC) 1923 1.1 riastrad srbm_soft_reset |= SOFT_RESET_MC; 1924 1.1 riastrad } 1925 1.1 riastrad 1926 1.1 riastrad if (grbm_soft_reset) { 1927 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 1928 1.1 riastrad tmp |= grbm_soft_reset; 1929 1.1 riastrad dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 1930 1.1 riastrad WREG32(GRBM_SOFT_RESET, tmp); 1931 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 1932 1.1 riastrad 1933 1.1 riastrad udelay(50); 1934 1.1 riastrad 1935 1.1 riastrad tmp &= ~grbm_soft_reset; 1936 1.1 riastrad WREG32(GRBM_SOFT_RESET, tmp); 1937 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 1938 1.1 riastrad } 1939 1.1 riastrad 1940 1.1 riastrad if (srbm_soft_reset) { 1941 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1942 1.1 riastrad tmp |= srbm_soft_reset; 1943 1.1 riastrad dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1944 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 1945 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1946 1.1 riastrad 1947 1.1 riastrad udelay(50); 1948 1.1 riastrad 1949 1.1 riastrad tmp &= ~srbm_soft_reset; 1950 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 1951 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1952 1.1 riastrad } 1953 1.1 riastrad 1954 1.1 riastrad /* Wait a little for things to settle down */ 1955 1.1 riastrad udelay(50); 1956 1.1 riastrad 1957 1.1 riastrad evergreen_mc_resume(rdev, &save); 1958 1.1 riastrad udelay(50); 1959 1.1 riastrad 1960 1.1 riastrad evergreen_print_gpu_status_regs(rdev); 1961 1.1 riastrad } 1962 1.1 riastrad 1963 1.3 riastrad int cayman_asic_reset(struct radeon_device *rdev, bool hard) 1964 1.1 riastrad { 1965 1.1 riastrad u32 reset_mask; 1966 1.1 riastrad 1967 1.3 riastrad if (hard) { 1968 1.3 riastrad evergreen_gpu_pci_config_reset(rdev); 1969 1.3 riastrad return 0; 1970 1.3 riastrad } 1971 1.3 riastrad 1972 1.1 riastrad reset_mask = cayman_gpu_check_soft_reset(rdev); 1973 1.1 riastrad 1974 1.1 riastrad if (reset_mask) 1975 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, true); 1976 1.1 riastrad 1977 1.1 riastrad cayman_gpu_soft_reset(rdev, reset_mask); 1978 1.1 riastrad 1979 1.1 riastrad reset_mask = cayman_gpu_check_soft_reset(rdev); 1980 1.1 riastrad 1981 1.1 riastrad if (reset_mask) 1982 1.1 riastrad evergreen_gpu_pci_config_reset(rdev); 1983 1.1 riastrad 1984 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, false); 1985 1.1 riastrad 1986 1.1 riastrad return 0; 1987 1.1 riastrad } 1988 1.1 riastrad 1989 1.1 riastrad /** 1990 1.1 riastrad * cayman_gfx_is_lockup - Check if the GFX engine is locked up 1991 1.1 riastrad * 1992 1.1 riastrad * @rdev: radeon_device pointer 1993 1.1 riastrad * @ring: radeon_ring structure holding ring information 1994 1.1 riastrad * 1995 1.1 riastrad * Check if the GFX engine is locked up. 1996 1.1 riastrad * Returns true if the engine appears to be locked up, false if not. 1997 1.1 riastrad */ 1998 1.1 riastrad bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1999 1.1 riastrad { 2000 1.1 riastrad u32 reset_mask = cayman_gpu_check_soft_reset(rdev); 2001 1.1 riastrad 2002 1.1 riastrad if (!(reset_mask & (RADEON_RESET_GFX | 2003 1.1 riastrad RADEON_RESET_COMPUTE | 2004 1.1 riastrad RADEON_RESET_CP))) { 2005 1.1 riastrad radeon_ring_lockup_update(rdev, ring); 2006 1.1 riastrad return false; 2007 1.1 riastrad } 2008 1.1 riastrad return radeon_ring_test_lockup(rdev, ring); 2009 1.1 riastrad } 2010 1.1 riastrad 2011 1.3 riastrad static void cayman_uvd_init(struct radeon_device *rdev) 2012 1.3 riastrad { 2013 1.3 riastrad int r; 2014 1.3 riastrad 2015 1.3 riastrad if (!rdev->has_uvd) 2016 1.3 riastrad return; 2017 1.3 riastrad 2018 1.3 riastrad r = radeon_uvd_init(rdev); 2019 1.3 riastrad if (r) { 2020 1.3 riastrad dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 2021 1.3 riastrad /* 2022 1.3 riastrad * At this point rdev->uvd.vcpu_bo is NULL which trickles down 2023 1.3 riastrad * to early fails uvd_v2_2_resume() and thus nothing happens 2024 1.3 riastrad * there. So it is pointless to try to go through that code 2025 1.3 riastrad * hence why we disable uvd here. 2026 1.3 riastrad */ 2027 1.3 riastrad rdev->has_uvd = false; 2028 1.3 riastrad return; 2029 1.3 riastrad } 2030 1.3 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 2031 1.3 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 2032 1.3 riastrad } 2033 1.3 riastrad 2034 1.3 riastrad static void cayman_uvd_start(struct radeon_device *rdev) 2035 1.3 riastrad { 2036 1.3 riastrad int r; 2037 1.3 riastrad 2038 1.3 riastrad if (!rdev->has_uvd) 2039 1.3 riastrad return; 2040 1.3 riastrad 2041 1.3 riastrad r = uvd_v2_2_resume(rdev); 2042 1.3 riastrad if (r) { 2043 1.3 riastrad dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 2044 1.3 riastrad goto error; 2045 1.3 riastrad } 2046 1.3 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 2047 1.3 riastrad if (r) { 2048 1.3 riastrad dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 2049 1.3 riastrad goto error; 2050 1.3 riastrad } 2051 1.3 riastrad return; 2052 1.3 riastrad 2053 1.3 riastrad error: 2054 1.3 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 2055 1.3 riastrad } 2056 1.3 riastrad 2057 1.3 riastrad static void cayman_uvd_resume(struct radeon_device *rdev) 2058 1.3 riastrad { 2059 1.3 riastrad struct radeon_ring *ring; 2060 1.3 riastrad int r; 2061 1.3 riastrad 2062 1.3 riastrad if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 2063 1.3 riastrad return; 2064 1.3 riastrad 2065 1.3 riastrad ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 2066 1.3 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 2067 1.3 riastrad if (r) { 2068 1.3 riastrad dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 2069 1.3 riastrad return; 2070 1.3 riastrad } 2071 1.3 riastrad r = uvd_v1_0_init(rdev); 2072 1.3 riastrad if (r) { 2073 1.3 riastrad dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 2074 1.3 riastrad return; 2075 1.3 riastrad } 2076 1.3 riastrad } 2077 1.3 riastrad 2078 1.3 riastrad static void cayman_vce_init(struct radeon_device *rdev) 2079 1.3 riastrad { 2080 1.3 riastrad int r; 2081 1.3 riastrad 2082 1.3 riastrad /* Only set for CHIP_ARUBA */ 2083 1.3 riastrad if (!rdev->has_vce) 2084 1.3 riastrad return; 2085 1.3 riastrad 2086 1.3 riastrad r = radeon_vce_init(rdev); 2087 1.3 riastrad if (r) { 2088 1.3 riastrad dev_err(rdev->dev, "failed VCE (%d) init.\n", r); 2089 1.3 riastrad /* 2090 1.3 riastrad * At this point rdev->vce.vcpu_bo is NULL which trickles down 2091 1.3 riastrad * to early fails cayman_vce_start() and thus nothing happens 2092 1.3 riastrad * there. So it is pointless to try to go through that code 2093 1.3 riastrad * hence why we disable vce here. 2094 1.3 riastrad */ 2095 1.3 riastrad rdev->has_vce = false; 2096 1.3 riastrad return; 2097 1.3 riastrad } 2098 1.3 riastrad rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL; 2099 1.3 riastrad r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096); 2100 1.3 riastrad rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL; 2101 1.3 riastrad r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096); 2102 1.3 riastrad } 2103 1.3 riastrad 2104 1.3 riastrad static void cayman_vce_start(struct radeon_device *rdev) 2105 1.3 riastrad { 2106 1.3 riastrad int r; 2107 1.3 riastrad 2108 1.3 riastrad if (!rdev->has_vce) 2109 1.3 riastrad return; 2110 1.3 riastrad 2111 1.3 riastrad r = radeon_vce_resume(rdev); 2112 1.3 riastrad if (r) { 2113 1.3 riastrad dev_err(rdev->dev, "failed VCE resume (%d).\n", r); 2114 1.3 riastrad goto error; 2115 1.3 riastrad } 2116 1.3 riastrad r = vce_v1_0_resume(rdev); 2117 1.3 riastrad if (r) { 2118 1.3 riastrad dev_err(rdev->dev, "failed VCE resume (%d).\n", r); 2119 1.3 riastrad goto error; 2120 1.3 riastrad } 2121 1.3 riastrad r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX); 2122 1.3 riastrad if (r) { 2123 1.3 riastrad dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r); 2124 1.3 riastrad goto error; 2125 1.3 riastrad } 2126 1.3 riastrad r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX); 2127 1.3 riastrad if (r) { 2128 1.3 riastrad dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r); 2129 1.3 riastrad goto error; 2130 1.3 riastrad } 2131 1.3 riastrad return; 2132 1.3 riastrad 2133 1.3 riastrad error: 2134 1.3 riastrad rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0; 2135 1.3 riastrad rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0; 2136 1.3 riastrad } 2137 1.3 riastrad 2138 1.3 riastrad static void cayman_vce_resume(struct radeon_device *rdev) 2139 1.3 riastrad { 2140 1.3 riastrad struct radeon_ring *ring; 2141 1.3 riastrad int r; 2142 1.3 riastrad 2143 1.3 riastrad if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size) 2144 1.3 riastrad return; 2145 1.3 riastrad 2146 1.3 riastrad ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; 2147 1.3 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 2148 1.3 riastrad if (r) { 2149 1.3 riastrad dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r); 2150 1.3 riastrad return; 2151 1.3 riastrad } 2152 1.3 riastrad ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; 2153 1.3 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 2154 1.3 riastrad if (r) { 2155 1.3 riastrad dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r); 2156 1.3 riastrad return; 2157 1.3 riastrad } 2158 1.3 riastrad r = vce_v1_0_init(rdev); 2159 1.3 riastrad if (r) { 2160 1.3 riastrad dev_err(rdev->dev, "failed initializing VCE (%d).\n", r); 2161 1.3 riastrad return; 2162 1.3 riastrad } 2163 1.3 riastrad } 2164 1.3 riastrad 2165 1.1 riastrad static int cayman_startup(struct radeon_device *rdev) 2166 1.1 riastrad { 2167 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2168 1.1 riastrad int r; 2169 1.1 riastrad 2170 1.1 riastrad /* enable pcie gen2 link */ 2171 1.1 riastrad evergreen_pcie_gen2_enable(rdev); 2172 1.1 riastrad /* enable aspm */ 2173 1.1 riastrad evergreen_program_aspm(rdev); 2174 1.1 riastrad 2175 1.1 riastrad /* scratch needs to be initialized before MC */ 2176 1.1 riastrad r = r600_vram_scratch_init(rdev); 2177 1.1 riastrad if (r) 2178 1.1 riastrad return r; 2179 1.1 riastrad 2180 1.1 riastrad evergreen_mc_program(rdev); 2181 1.1 riastrad 2182 1.1 riastrad if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) { 2183 1.1 riastrad r = ni_mc_load_microcode(rdev); 2184 1.1 riastrad if (r) { 2185 1.1 riastrad DRM_ERROR("Failed to load MC firmware!\n"); 2186 1.1 riastrad return r; 2187 1.1 riastrad } 2188 1.1 riastrad } 2189 1.1 riastrad 2190 1.1 riastrad r = cayman_pcie_gart_enable(rdev); 2191 1.1 riastrad if (r) 2192 1.1 riastrad return r; 2193 1.1 riastrad cayman_gpu_init(rdev); 2194 1.1 riastrad 2195 1.1 riastrad /* allocate rlc buffers */ 2196 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 2197 1.1 riastrad rdev->rlc.reg_list = tn_rlc_save_restore_register_list; 2198 1.1 riastrad rdev->rlc.reg_list_size = 2199 1.1 riastrad (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list); 2200 1.1 riastrad rdev->rlc.cs_data = cayman_cs_data; 2201 1.1 riastrad r = sumo_rlc_init(rdev); 2202 1.1 riastrad if (r) { 2203 1.1 riastrad DRM_ERROR("Failed to init rlc BOs!\n"); 2204 1.1 riastrad return r; 2205 1.1 riastrad } 2206 1.1 riastrad } 2207 1.1 riastrad 2208 1.1 riastrad /* allocate wb buffer */ 2209 1.1 riastrad r = radeon_wb_init(rdev); 2210 1.1 riastrad if (r) 2211 1.1 riastrad return r; 2212 1.1 riastrad 2213 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 2214 1.1 riastrad if (r) { 2215 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2216 1.1 riastrad return r; 2217 1.1 riastrad } 2218 1.1 riastrad 2219 1.3 riastrad cayman_uvd_start(rdev); 2220 1.3 riastrad cayman_vce_start(rdev); 2221 1.1 riastrad 2222 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX); 2223 1.1 riastrad if (r) { 2224 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2225 1.1 riastrad return r; 2226 1.1 riastrad } 2227 1.1 riastrad 2228 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX); 2229 1.1 riastrad if (r) { 2230 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2231 1.1 riastrad return r; 2232 1.1 riastrad } 2233 1.1 riastrad 2234 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 2235 1.1 riastrad if (r) { 2236 1.1 riastrad dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 2237 1.1 riastrad return r; 2238 1.1 riastrad } 2239 1.1 riastrad 2240 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX); 2241 1.1 riastrad if (r) { 2242 1.1 riastrad dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 2243 1.1 riastrad return r; 2244 1.1 riastrad } 2245 1.1 riastrad 2246 1.1 riastrad /* Enable IRQ */ 2247 1.1 riastrad if (!rdev->irq.installed) { 2248 1.1 riastrad r = radeon_irq_kms_init(rdev); 2249 1.1 riastrad if (r) 2250 1.1 riastrad return r; 2251 1.1 riastrad } 2252 1.1 riastrad 2253 1.1 riastrad r = r600_irq_init(rdev); 2254 1.1 riastrad if (r) { 2255 1.1 riastrad DRM_ERROR("radeon: IH init failed (%d).\n", r); 2256 1.1 riastrad radeon_irq_kms_fini(rdev); 2257 1.1 riastrad return r; 2258 1.1 riastrad } 2259 1.1 riastrad evergreen_irq_set(rdev); 2260 1.1 riastrad 2261 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 2262 1.1 riastrad RADEON_CP_PACKET2); 2263 1.1 riastrad if (r) 2264 1.1 riastrad return r; 2265 1.1 riastrad 2266 1.1 riastrad ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 2267 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 2268 1.1 riastrad DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 2269 1.1 riastrad if (r) 2270 1.1 riastrad return r; 2271 1.1 riastrad 2272 1.1 riastrad ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 2273 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 2274 1.1 riastrad DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 2275 1.1 riastrad if (r) 2276 1.1 riastrad return r; 2277 1.1 riastrad 2278 1.1 riastrad r = cayman_cp_load_microcode(rdev); 2279 1.1 riastrad if (r) 2280 1.1 riastrad return r; 2281 1.1 riastrad r = cayman_cp_resume(rdev); 2282 1.1 riastrad if (r) 2283 1.1 riastrad return r; 2284 1.1 riastrad 2285 1.1 riastrad r = cayman_dma_resume(rdev); 2286 1.1 riastrad if (r) 2287 1.1 riastrad return r; 2288 1.1 riastrad 2289 1.3 riastrad cayman_uvd_resume(rdev); 2290 1.3 riastrad cayman_vce_resume(rdev); 2291 1.1 riastrad 2292 1.1 riastrad r = radeon_ib_pool_init(rdev); 2293 1.1 riastrad if (r) { 2294 1.1 riastrad dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 2295 1.1 riastrad return r; 2296 1.1 riastrad } 2297 1.1 riastrad 2298 1.1 riastrad r = radeon_vm_manager_init(rdev); 2299 1.1 riastrad if (r) { 2300 1.1 riastrad dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); 2301 1.1 riastrad return r; 2302 1.1 riastrad } 2303 1.1 riastrad 2304 1.1 riastrad r = radeon_audio_init(rdev); 2305 1.1 riastrad if (r) 2306 1.1 riastrad return r; 2307 1.1 riastrad 2308 1.1 riastrad return 0; 2309 1.1 riastrad } 2310 1.1 riastrad 2311 1.1 riastrad int cayman_resume(struct radeon_device *rdev) 2312 1.1 riastrad { 2313 1.1 riastrad int r; 2314 1.1 riastrad 2315 1.1 riastrad /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 2316 1.1 riastrad * posting will perform necessary task to bring back GPU into good 2317 1.1 riastrad * shape. 2318 1.1 riastrad */ 2319 1.1 riastrad /* post card */ 2320 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 2321 1.1 riastrad 2322 1.1 riastrad /* init golden registers */ 2323 1.1 riastrad ni_init_golden_registers(rdev); 2324 1.1 riastrad 2325 1.1 riastrad if (rdev->pm.pm_method == PM_METHOD_DPM) 2326 1.1 riastrad radeon_pm_resume(rdev); 2327 1.1 riastrad 2328 1.1 riastrad rdev->accel_working = true; 2329 1.1 riastrad r = cayman_startup(rdev); 2330 1.1 riastrad if (r) { 2331 1.1 riastrad DRM_ERROR("cayman startup failed on resume\n"); 2332 1.1 riastrad rdev->accel_working = false; 2333 1.1 riastrad return r; 2334 1.1 riastrad } 2335 1.1 riastrad return r; 2336 1.1 riastrad } 2337 1.1 riastrad 2338 1.1 riastrad int cayman_suspend(struct radeon_device *rdev) 2339 1.1 riastrad { 2340 1.1 riastrad radeon_pm_suspend(rdev); 2341 1.1 riastrad radeon_audio_fini(rdev); 2342 1.1 riastrad radeon_vm_manager_fini(rdev); 2343 1.1 riastrad cayman_cp_enable(rdev, false); 2344 1.1 riastrad cayman_dma_stop(rdev); 2345 1.3 riastrad if (rdev->has_uvd) { 2346 1.3 riastrad uvd_v1_0_fini(rdev); 2347 1.3 riastrad radeon_uvd_suspend(rdev); 2348 1.3 riastrad } 2349 1.1 riastrad evergreen_irq_suspend(rdev); 2350 1.1 riastrad radeon_wb_disable(rdev); 2351 1.1 riastrad cayman_pcie_gart_disable(rdev); 2352 1.1 riastrad return 0; 2353 1.1 riastrad } 2354 1.1 riastrad 2355 1.1 riastrad /* Plan is to move initialization in that function and use 2356 1.1 riastrad * helper function so that radeon_device_init pretty much 2357 1.1 riastrad * do nothing more than calling asic specific function. This 2358 1.1 riastrad * should also allow to remove a bunch of callback function 2359 1.1 riastrad * like vram_info. 2360 1.1 riastrad */ 2361 1.1 riastrad int cayman_init(struct radeon_device *rdev) 2362 1.1 riastrad { 2363 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2364 1.1 riastrad int r; 2365 1.1 riastrad 2366 1.1 riastrad /* Read BIOS */ 2367 1.1 riastrad if (!radeon_get_bios(rdev)) { 2368 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 2369 1.1 riastrad return -EINVAL; 2370 1.1 riastrad } 2371 1.1 riastrad /* Must be an ATOMBIOS */ 2372 1.1 riastrad if (!rdev->is_atom_bios) { 2373 1.1 riastrad dev_err(rdev->dev, "Expecting atombios for cayman GPU\n"); 2374 1.1 riastrad return -EINVAL; 2375 1.1 riastrad } 2376 1.1 riastrad r = radeon_atombios_init(rdev); 2377 1.1 riastrad if (r) 2378 1.1 riastrad return r; 2379 1.1 riastrad 2380 1.1 riastrad /* Post card if necessary */ 2381 1.1 riastrad if (!radeon_card_posted(rdev)) { 2382 1.1 riastrad if (!rdev->bios) { 2383 1.1 riastrad dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 2384 1.1 riastrad return -EINVAL; 2385 1.1 riastrad } 2386 1.1 riastrad DRM_INFO("GPU not posted. posting now...\n"); 2387 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 2388 1.1 riastrad } 2389 1.1 riastrad /* init golden registers */ 2390 1.1 riastrad ni_init_golden_registers(rdev); 2391 1.1 riastrad /* Initialize scratch registers */ 2392 1.1 riastrad r600_scratch_init(rdev); 2393 1.1 riastrad /* Initialize surface registers */ 2394 1.1 riastrad radeon_surface_init(rdev); 2395 1.1 riastrad /* Initialize clocks */ 2396 1.1 riastrad radeon_get_clock_info(rdev->ddev); 2397 1.1 riastrad /* Fence driver */ 2398 1.1 riastrad r = radeon_fence_driver_init(rdev); 2399 1.1 riastrad if (r) 2400 1.1 riastrad return r; 2401 1.1 riastrad /* initialize memory controller */ 2402 1.1 riastrad r = evergreen_mc_init(rdev); 2403 1.1 riastrad if (r) 2404 1.1 riastrad return r; 2405 1.1 riastrad /* Memory manager */ 2406 1.1 riastrad r = radeon_bo_init(rdev); 2407 1.1 riastrad if (r) 2408 1.1 riastrad return r; 2409 1.1 riastrad 2410 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 2411 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2412 1.1 riastrad r = ni_init_microcode(rdev); 2413 1.1 riastrad if (r) { 2414 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 2415 1.1 riastrad return r; 2416 1.1 riastrad } 2417 1.1 riastrad } 2418 1.1 riastrad } else { 2419 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 2420 1.1 riastrad r = ni_init_microcode(rdev); 2421 1.1 riastrad if (r) { 2422 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 2423 1.1 riastrad return r; 2424 1.1 riastrad } 2425 1.1 riastrad } 2426 1.1 riastrad } 2427 1.1 riastrad 2428 1.1 riastrad /* Initialize power management */ 2429 1.1 riastrad radeon_pm_init(rdev); 2430 1.1 riastrad 2431 1.1 riastrad ring->ring_obj = NULL; 2432 1.1 riastrad r600_ring_init(rdev, ring, 1024 * 1024); 2433 1.1 riastrad 2434 1.1 riastrad ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 2435 1.1 riastrad ring->ring_obj = NULL; 2436 1.1 riastrad r600_ring_init(rdev, ring, 64 * 1024); 2437 1.1 riastrad 2438 1.1 riastrad ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 2439 1.1 riastrad ring->ring_obj = NULL; 2440 1.1 riastrad r600_ring_init(rdev, ring, 64 * 1024); 2441 1.1 riastrad 2442 1.3 riastrad cayman_uvd_init(rdev); 2443 1.3 riastrad cayman_vce_init(rdev); 2444 1.1 riastrad 2445 1.1 riastrad rdev->ih.ring_obj = NULL; 2446 1.1 riastrad r600_ih_ring_init(rdev, 64 * 1024); 2447 1.1 riastrad 2448 1.1 riastrad r = r600_pcie_gart_init(rdev); 2449 1.1 riastrad if (r) 2450 1.1 riastrad return r; 2451 1.1 riastrad 2452 1.1 riastrad rdev->accel_working = true; 2453 1.1 riastrad r = cayman_startup(rdev); 2454 1.1 riastrad if (r) { 2455 1.1 riastrad dev_err(rdev->dev, "disabling GPU acceleration\n"); 2456 1.1 riastrad cayman_cp_fini(rdev); 2457 1.1 riastrad cayman_dma_fini(rdev); 2458 1.1 riastrad r600_irq_fini(rdev); 2459 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 2460 1.1 riastrad sumo_rlc_fini(rdev); 2461 1.1 riastrad radeon_wb_fini(rdev); 2462 1.1 riastrad radeon_ib_pool_fini(rdev); 2463 1.1 riastrad radeon_vm_manager_fini(rdev); 2464 1.1 riastrad radeon_irq_kms_fini(rdev); 2465 1.1 riastrad cayman_pcie_gart_fini(rdev); 2466 1.1 riastrad rdev->accel_working = false; 2467 1.1 riastrad } 2468 1.1 riastrad 2469 1.1 riastrad /* Don't start up if the MC ucode is missing. 2470 1.1 riastrad * The default clocks and voltages before the MC ucode 2471 1.1 riastrad * is loaded are not suffient for advanced operations. 2472 1.1 riastrad * 2473 1.1 riastrad * We can skip this check for TN, because there is no MC 2474 1.1 riastrad * ucode. 2475 1.1 riastrad */ 2476 1.1 riastrad if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { 2477 1.1 riastrad DRM_ERROR("radeon: MC ucode required for NI+.\n"); 2478 1.1 riastrad return -EINVAL; 2479 1.1 riastrad } 2480 1.1 riastrad 2481 1.1 riastrad return 0; 2482 1.1 riastrad } 2483 1.1 riastrad 2484 1.1 riastrad void cayman_fini(struct radeon_device *rdev) 2485 1.1 riastrad { 2486 1.1 riastrad radeon_pm_fini(rdev); 2487 1.1 riastrad cayman_cp_fini(rdev); 2488 1.1 riastrad cayman_dma_fini(rdev); 2489 1.1 riastrad r600_irq_fini(rdev); 2490 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 2491 1.1 riastrad sumo_rlc_fini(rdev); 2492 1.1 riastrad radeon_wb_fini(rdev); 2493 1.1 riastrad radeon_vm_manager_fini(rdev); 2494 1.1 riastrad radeon_ib_pool_fini(rdev); 2495 1.1 riastrad radeon_irq_kms_fini(rdev); 2496 1.1 riastrad uvd_v1_0_fini(rdev); 2497 1.1 riastrad radeon_uvd_fini(rdev); 2498 1.3 riastrad if (rdev->has_vce) 2499 1.1 riastrad radeon_vce_fini(rdev); 2500 1.1 riastrad cayman_pcie_gart_fini(rdev); 2501 1.1 riastrad r600_vram_scratch_fini(rdev); 2502 1.1 riastrad radeon_gem_fini(rdev); 2503 1.1 riastrad radeon_fence_driver_fini(rdev); 2504 1.1 riastrad radeon_bo_fini(rdev); 2505 1.1 riastrad radeon_atombios_fini(rdev); 2506 1.1 riastrad kfree(rdev->bios); 2507 1.1 riastrad rdev->bios = NULL; 2508 1.1 riastrad } 2509 1.1 riastrad 2510 1.1 riastrad /* 2511 1.1 riastrad * vm 2512 1.1 riastrad */ 2513 1.1 riastrad int cayman_vm_init(struct radeon_device *rdev) 2514 1.1 riastrad { 2515 1.1 riastrad /* number of VMs */ 2516 1.1 riastrad rdev->vm_manager.nvm = 8; 2517 1.1 riastrad /* base offset of vram pages */ 2518 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 2519 1.1 riastrad u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET); 2520 1.1 riastrad tmp <<= 22; 2521 1.1 riastrad rdev->vm_manager.vram_base_offset = tmp; 2522 1.1 riastrad } else 2523 1.1 riastrad rdev->vm_manager.vram_base_offset = 0; 2524 1.1 riastrad return 0; 2525 1.1 riastrad } 2526 1.1 riastrad 2527 1.1 riastrad void cayman_vm_fini(struct radeon_device *rdev) 2528 1.1 riastrad { 2529 1.1 riastrad } 2530 1.1 riastrad 2531 1.1 riastrad /** 2532 1.1 riastrad * cayman_vm_decode_fault - print human readable fault info 2533 1.1 riastrad * 2534 1.1 riastrad * @rdev: radeon_device pointer 2535 1.1 riastrad * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value 2536 1.1 riastrad * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value 2537 1.1 riastrad * 2538 1.1 riastrad * Print human readable fault information (cayman/TN). 2539 1.1 riastrad */ 2540 1.1 riastrad void cayman_vm_decode_fault(struct radeon_device *rdev, 2541 1.1 riastrad u32 status, u32 addr) 2542 1.1 riastrad { 2543 1.1 riastrad u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; 2544 1.1 riastrad u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; 2545 1.1 riastrad u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; 2546 1.1 riastrad const char *block; 2547 1.1 riastrad 2548 1.1 riastrad switch (mc_id) { 2549 1.1 riastrad case 32: 2550 1.1 riastrad case 16: 2551 1.1 riastrad case 96: 2552 1.1 riastrad case 80: 2553 1.1 riastrad case 160: 2554 1.1 riastrad case 144: 2555 1.1 riastrad case 224: 2556 1.1 riastrad case 208: 2557 1.1 riastrad block = "CB"; 2558 1.1 riastrad break; 2559 1.1 riastrad case 33: 2560 1.1 riastrad case 17: 2561 1.1 riastrad case 97: 2562 1.1 riastrad case 81: 2563 1.1 riastrad case 161: 2564 1.1 riastrad case 145: 2565 1.1 riastrad case 225: 2566 1.1 riastrad case 209: 2567 1.1 riastrad block = "CB_FMASK"; 2568 1.1 riastrad break; 2569 1.1 riastrad case 34: 2570 1.1 riastrad case 18: 2571 1.1 riastrad case 98: 2572 1.1 riastrad case 82: 2573 1.1 riastrad case 162: 2574 1.1 riastrad case 146: 2575 1.1 riastrad case 226: 2576 1.1 riastrad case 210: 2577 1.1 riastrad block = "CB_CMASK"; 2578 1.1 riastrad break; 2579 1.1 riastrad case 35: 2580 1.1 riastrad case 19: 2581 1.1 riastrad case 99: 2582 1.1 riastrad case 83: 2583 1.1 riastrad case 163: 2584 1.1 riastrad case 147: 2585 1.1 riastrad case 227: 2586 1.1 riastrad case 211: 2587 1.1 riastrad block = "CB_IMMED"; 2588 1.1 riastrad break; 2589 1.1 riastrad case 36: 2590 1.1 riastrad case 20: 2591 1.1 riastrad case 100: 2592 1.1 riastrad case 84: 2593 1.1 riastrad case 164: 2594 1.1 riastrad case 148: 2595 1.1 riastrad case 228: 2596 1.1 riastrad case 212: 2597 1.1 riastrad block = "DB"; 2598 1.1 riastrad break; 2599 1.1 riastrad case 37: 2600 1.1 riastrad case 21: 2601 1.1 riastrad case 101: 2602 1.1 riastrad case 85: 2603 1.1 riastrad case 165: 2604 1.1 riastrad case 149: 2605 1.1 riastrad case 229: 2606 1.1 riastrad case 213: 2607 1.1 riastrad block = "DB_HTILE"; 2608 1.1 riastrad break; 2609 1.1 riastrad case 38: 2610 1.1 riastrad case 22: 2611 1.1 riastrad case 102: 2612 1.1 riastrad case 86: 2613 1.1 riastrad case 166: 2614 1.1 riastrad case 150: 2615 1.1 riastrad case 230: 2616 1.1 riastrad case 214: 2617 1.1 riastrad block = "SX"; 2618 1.1 riastrad break; 2619 1.1 riastrad case 39: 2620 1.1 riastrad case 23: 2621 1.1 riastrad case 103: 2622 1.1 riastrad case 87: 2623 1.1 riastrad case 167: 2624 1.1 riastrad case 151: 2625 1.1 riastrad case 231: 2626 1.1 riastrad case 215: 2627 1.1 riastrad block = "DB_STEN"; 2628 1.1 riastrad break; 2629 1.1 riastrad case 40: 2630 1.1 riastrad case 24: 2631 1.1 riastrad case 104: 2632 1.1 riastrad case 88: 2633 1.1 riastrad case 232: 2634 1.1 riastrad case 216: 2635 1.1 riastrad case 168: 2636 1.1 riastrad case 152: 2637 1.1 riastrad block = "TC_TFETCH"; 2638 1.1 riastrad break; 2639 1.1 riastrad case 41: 2640 1.1 riastrad case 25: 2641 1.1 riastrad case 105: 2642 1.1 riastrad case 89: 2643 1.1 riastrad case 233: 2644 1.1 riastrad case 217: 2645 1.1 riastrad case 169: 2646 1.1 riastrad case 153: 2647 1.1 riastrad block = "TC_VFETCH"; 2648 1.1 riastrad break; 2649 1.1 riastrad case 42: 2650 1.1 riastrad case 26: 2651 1.1 riastrad case 106: 2652 1.1 riastrad case 90: 2653 1.1 riastrad case 234: 2654 1.1 riastrad case 218: 2655 1.1 riastrad case 170: 2656 1.1 riastrad case 154: 2657 1.1 riastrad block = "VC"; 2658 1.1 riastrad break; 2659 1.1 riastrad case 112: 2660 1.1 riastrad block = "CP"; 2661 1.1 riastrad break; 2662 1.1 riastrad case 113: 2663 1.1 riastrad case 114: 2664 1.1 riastrad block = "SH"; 2665 1.1 riastrad break; 2666 1.1 riastrad case 115: 2667 1.1 riastrad block = "VGT"; 2668 1.1 riastrad break; 2669 1.1 riastrad case 178: 2670 1.1 riastrad block = "IH"; 2671 1.1 riastrad break; 2672 1.1 riastrad case 51: 2673 1.1 riastrad block = "RLC"; 2674 1.1 riastrad break; 2675 1.1 riastrad case 55: 2676 1.1 riastrad block = "DMA"; 2677 1.1 riastrad break; 2678 1.1 riastrad case 56: 2679 1.1 riastrad block = "HDP"; 2680 1.1 riastrad break; 2681 1.1 riastrad default: 2682 1.1 riastrad block = "unknown"; 2683 1.1 riastrad break; 2684 1.1 riastrad } 2685 1.1 riastrad 2686 1.1 riastrad printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", 2687 1.1 riastrad protections, vmid, addr, 2688 1.1 riastrad (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", 2689 1.1 riastrad block, mc_id); 2690 1.1 riastrad } 2691 1.1 riastrad 2692 1.1 riastrad /** 2693 1.1 riastrad * cayman_vm_flush - vm flush using the CP 2694 1.1 riastrad * 2695 1.1 riastrad * @rdev: radeon_device pointer 2696 1.1 riastrad * 2697 1.1 riastrad * Update the page table base and flush the VM TLB 2698 1.1 riastrad * using the CP (cayman-si). 2699 1.1 riastrad */ 2700 1.1 riastrad void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, 2701 1.1 riastrad unsigned vm_id, uint64_t pd_addr) 2702 1.1 riastrad { 2703 1.1 riastrad radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0)); 2704 1.1 riastrad radeon_ring_write(ring, pd_addr >> 12); 2705 1.1 riastrad 2706 1.1 riastrad /* flush hdp cache */ 2707 1.1 riastrad radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0)); 2708 1.1 riastrad radeon_ring_write(ring, 0x1); 2709 1.1 riastrad 2710 1.1 riastrad /* bits 0-7 are the VM contexts0-7 */ 2711 1.1 riastrad radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); 2712 1.1 riastrad radeon_ring_write(ring, 1 << vm_id); 2713 1.1 riastrad 2714 1.1 riastrad /* wait for the invalidate to complete */ 2715 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 2716 1.1 riastrad radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ 2717 1.1 riastrad WAIT_REG_MEM_ENGINE(0))); /* me */ 2718 1.1 riastrad radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 2719 1.1 riastrad radeon_ring_write(ring, 0); 2720 1.1 riastrad radeon_ring_write(ring, 0); /* ref */ 2721 1.1 riastrad radeon_ring_write(ring, 0); /* mask */ 2722 1.1 riastrad radeon_ring_write(ring, 0x20); /* poll interval */ 2723 1.1 riastrad 2724 1.1 riastrad /* sync PFP to ME, otherwise we might get invalid PFP reads */ 2725 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2726 1.1 riastrad radeon_ring_write(ring, 0x0); 2727 1.1 riastrad } 2728 1.1 riastrad 2729 1.1 riastrad int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk) 2730 1.1 riastrad { 2731 1.1 riastrad struct atom_clock_dividers dividers; 2732 1.1 riastrad int r, i; 2733 1.1 riastrad 2734 1.3 riastrad r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 2735 1.1 riastrad ecclk, false, ÷rs); 2736 1.1 riastrad if (r) 2737 1.1 riastrad return r; 2738 1.1 riastrad 2739 1.1 riastrad for (i = 0; i < 100; i++) { 2740 1.1 riastrad if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2741 1.1 riastrad break; 2742 1.1 riastrad mdelay(10); 2743 1.1 riastrad } 2744 1.1 riastrad if (i == 100) 2745 1.1 riastrad return -ETIMEDOUT; 2746 1.1 riastrad 2747 1.1 riastrad WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK)); 2748 1.1 riastrad 2749 1.1 riastrad for (i = 0; i < 100; i++) { 2750 1.1 riastrad if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2751 1.1 riastrad break; 2752 1.1 riastrad mdelay(10); 2753 1.1 riastrad } 2754 1.1 riastrad if (i == 100) 2755 1.1 riastrad return -ETIMEDOUT; 2756 1.1 riastrad 2757 1.1 riastrad return 0; 2758 1.1 riastrad } 2759