1 1.6 mrg /* $NetBSD: radeon_evergreen.c,v 1.6 2023/09/30 10:46:45 mrg 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.5 riastrad 27 1.1 riastrad #include <sys/cdefs.h> 28 1.6 mrg __KERNEL_RCSID(0, "$NetBSD: radeon_evergreen.c,v 1.6 2023/09/30 10:46:45 mrg Exp $"); 29 1.1 riastrad 30 1.1 riastrad #include <linux/firmware.h> 31 1.5 riastrad #include <linux/pci.h> 32 1.1 riastrad #include <linux/slab.h> 33 1.5 riastrad 34 1.5 riastrad #include <drm/drm_vblank.h> 35 1.1 riastrad #include <drm/radeon_drm.h> 36 1.5 riastrad 37 1.1 riastrad #include "atom.h" 38 1.1 riastrad #include "avivod.h" 39 1.5 riastrad #include "evergreen_blit_shaders.h" 40 1.1 riastrad #include "evergreen_reg.h" 41 1.5 riastrad #include "evergreend.h" 42 1.5 riastrad #include "radeon.h" 43 1.5 riastrad #include "radeon_asic.h" 44 1.5 riastrad #include "radeon_audio.h" 45 1.1 riastrad #include "radeon_ucode.h" 46 1.1 riastrad 47 1.5 riastrad #define DC_HPDx_CONTROL(x) (DC_HPD1_CONTROL + (x * 0xc)) 48 1.5 riastrad #define DC_HPDx_INT_CONTROL(x) (DC_HPD1_INT_CONTROL + (x * 0xc)) 49 1.5 riastrad #define DC_HPDx_INT_STATUS_REG(x) (DC_HPD1_INT_STATUS + (x * 0xc)) 50 1.5 riastrad 51 1.1 riastrad /* 52 1.1 riastrad * Indirect registers accessor 53 1.1 riastrad */ 54 1.1 riastrad u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg) 55 1.1 riastrad { 56 1.1 riastrad unsigned long flags; 57 1.1 riastrad u32 r; 58 1.1 riastrad 59 1.1 riastrad spin_lock_irqsave(&rdev->cg_idx_lock, flags); 60 1.1 riastrad WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff)); 61 1.1 riastrad r = RREG32(EVERGREEN_CG_IND_DATA); 62 1.1 riastrad spin_unlock_irqrestore(&rdev->cg_idx_lock, flags); 63 1.1 riastrad return r; 64 1.1 riastrad } 65 1.1 riastrad 66 1.1 riastrad void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v) 67 1.1 riastrad { 68 1.1 riastrad unsigned long flags; 69 1.1 riastrad 70 1.1 riastrad spin_lock_irqsave(&rdev->cg_idx_lock, flags); 71 1.1 riastrad WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff)); 72 1.1 riastrad WREG32(EVERGREEN_CG_IND_DATA, (v)); 73 1.1 riastrad spin_unlock_irqrestore(&rdev->cg_idx_lock, flags); 74 1.1 riastrad } 75 1.1 riastrad 76 1.1 riastrad u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg) 77 1.1 riastrad { 78 1.1 riastrad unsigned long flags; 79 1.1 riastrad u32 r; 80 1.1 riastrad 81 1.1 riastrad spin_lock_irqsave(&rdev->pif_idx_lock, flags); 82 1.1 riastrad WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 83 1.1 riastrad r = RREG32(EVERGREEN_PIF_PHY0_DATA); 84 1.1 riastrad spin_unlock_irqrestore(&rdev->pif_idx_lock, flags); 85 1.1 riastrad return r; 86 1.1 riastrad } 87 1.1 riastrad 88 1.1 riastrad void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v) 89 1.1 riastrad { 90 1.1 riastrad unsigned long flags; 91 1.1 riastrad 92 1.1 riastrad spin_lock_irqsave(&rdev->pif_idx_lock, flags); 93 1.1 riastrad WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 94 1.1 riastrad WREG32(EVERGREEN_PIF_PHY0_DATA, (v)); 95 1.1 riastrad spin_unlock_irqrestore(&rdev->pif_idx_lock, flags); 96 1.1 riastrad } 97 1.1 riastrad 98 1.1 riastrad u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg) 99 1.1 riastrad { 100 1.1 riastrad unsigned long flags; 101 1.1 riastrad u32 r; 102 1.1 riastrad 103 1.1 riastrad spin_lock_irqsave(&rdev->pif_idx_lock, flags); 104 1.1 riastrad WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 105 1.1 riastrad r = RREG32(EVERGREEN_PIF_PHY1_DATA); 106 1.1 riastrad spin_unlock_irqrestore(&rdev->pif_idx_lock, flags); 107 1.1 riastrad return r; 108 1.1 riastrad } 109 1.1 riastrad 110 1.1 riastrad void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v) 111 1.1 riastrad { 112 1.1 riastrad unsigned long flags; 113 1.1 riastrad 114 1.1 riastrad spin_lock_irqsave(&rdev->pif_idx_lock, flags); 115 1.1 riastrad WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 116 1.1 riastrad WREG32(EVERGREEN_PIF_PHY1_DATA, (v)); 117 1.1 riastrad spin_unlock_irqrestore(&rdev->pif_idx_lock, flags); 118 1.1 riastrad } 119 1.1 riastrad 120 1.1 riastrad static const u32 crtc_offsets[6] = 121 1.1 riastrad { 122 1.1 riastrad EVERGREEN_CRTC0_REGISTER_OFFSET, 123 1.1 riastrad EVERGREEN_CRTC1_REGISTER_OFFSET, 124 1.1 riastrad EVERGREEN_CRTC2_REGISTER_OFFSET, 125 1.1 riastrad EVERGREEN_CRTC3_REGISTER_OFFSET, 126 1.1 riastrad EVERGREEN_CRTC4_REGISTER_OFFSET, 127 1.1 riastrad EVERGREEN_CRTC5_REGISTER_OFFSET 128 1.1 riastrad }; 129 1.1 riastrad 130 1.1 riastrad #include "clearstate_evergreen.h" 131 1.1 riastrad 132 1.1 riastrad static const u32 sumo_rlc_save_restore_register_list[] = 133 1.1 riastrad { 134 1.1 riastrad 0x98fc, 135 1.1 riastrad 0x9830, 136 1.1 riastrad 0x9834, 137 1.1 riastrad 0x9838, 138 1.1 riastrad 0x9870, 139 1.1 riastrad 0x9874, 140 1.1 riastrad 0x8a14, 141 1.1 riastrad 0x8b24, 142 1.1 riastrad 0x8bcc, 143 1.1 riastrad 0x8b10, 144 1.1 riastrad 0x8d00, 145 1.1 riastrad 0x8d04, 146 1.1 riastrad 0x8c00, 147 1.1 riastrad 0x8c04, 148 1.1 riastrad 0x8c08, 149 1.1 riastrad 0x8c0c, 150 1.1 riastrad 0x8d8c, 151 1.1 riastrad 0x8c20, 152 1.1 riastrad 0x8c24, 153 1.1 riastrad 0x8c28, 154 1.1 riastrad 0x8c18, 155 1.1 riastrad 0x8c1c, 156 1.1 riastrad 0x8cf0, 157 1.1 riastrad 0x8e2c, 158 1.1 riastrad 0x8e38, 159 1.1 riastrad 0x8c30, 160 1.1 riastrad 0x9508, 161 1.1 riastrad 0x9688, 162 1.1 riastrad 0x9608, 163 1.1 riastrad 0x960c, 164 1.1 riastrad 0x9610, 165 1.1 riastrad 0x9614, 166 1.1 riastrad 0x88c4, 167 1.1 riastrad 0x88d4, 168 1.1 riastrad 0xa008, 169 1.1 riastrad 0x900c, 170 1.1 riastrad 0x9100, 171 1.1 riastrad 0x913c, 172 1.1 riastrad 0x98f8, 173 1.1 riastrad 0x98f4, 174 1.1 riastrad 0x9b7c, 175 1.1 riastrad 0x3f8c, 176 1.1 riastrad 0x8950, 177 1.1 riastrad 0x8954, 178 1.1 riastrad 0x8a18, 179 1.1 riastrad 0x8b28, 180 1.1 riastrad 0x9144, 181 1.1 riastrad 0x9148, 182 1.1 riastrad 0x914c, 183 1.1 riastrad 0x3f90, 184 1.1 riastrad 0x3f94, 185 1.1 riastrad 0x915c, 186 1.1 riastrad 0x9160, 187 1.1 riastrad 0x9178, 188 1.1 riastrad 0x917c, 189 1.1 riastrad 0x9180, 190 1.1 riastrad 0x918c, 191 1.1 riastrad 0x9190, 192 1.1 riastrad 0x9194, 193 1.1 riastrad 0x9198, 194 1.1 riastrad 0x919c, 195 1.1 riastrad 0x91a8, 196 1.1 riastrad 0x91ac, 197 1.1 riastrad 0x91b0, 198 1.1 riastrad 0x91b4, 199 1.1 riastrad 0x91b8, 200 1.1 riastrad 0x91c4, 201 1.1 riastrad 0x91c8, 202 1.1 riastrad 0x91cc, 203 1.1 riastrad 0x91d0, 204 1.1 riastrad 0x91d4, 205 1.1 riastrad 0x91e0, 206 1.1 riastrad 0x91e4, 207 1.1 riastrad 0x91ec, 208 1.1 riastrad 0x91f0, 209 1.1 riastrad 0x91f4, 210 1.1 riastrad 0x9200, 211 1.1 riastrad 0x9204, 212 1.1 riastrad 0x929c, 213 1.1 riastrad 0x9150, 214 1.1 riastrad 0x802c, 215 1.1 riastrad }; 216 1.1 riastrad 217 1.1 riastrad static void evergreen_gpu_init(struct radeon_device *rdev); 218 1.1 riastrad void evergreen_fini(struct radeon_device *rdev); 219 1.1 riastrad void evergreen_pcie_gen2_enable(struct radeon_device *rdev); 220 1.1 riastrad void evergreen_program_aspm(struct radeon_device *rdev); 221 1.1 riastrad extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev, 222 1.1 riastrad int ring, u32 cp_int_cntl); 223 1.1 riastrad extern void cayman_vm_decode_fault(struct radeon_device *rdev, 224 1.1 riastrad u32 status, u32 addr); 225 1.1 riastrad void cik_init_cp_pg_table(struct radeon_device *rdev); 226 1.1 riastrad 227 1.1 riastrad extern u32 si_get_csb_size(struct radeon_device *rdev); 228 1.1 riastrad extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer); 229 1.1 riastrad extern u32 cik_get_csb_size(struct radeon_device *rdev); 230 1.1 riastrad extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer); 231 1.1 riastrad extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev); 232 1.1 riastrad 233 1.1 riastrad static const u32 evergreen_golden_registers[] = 234 1.1 riastrad { 235 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 236 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 237 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 238 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 239 1.1 riastrad 0x9b7c, 0xffffffff, 0x00000000, 240 1.1 riastrad 0x8a14, 0xffffffff, 0x00000007, 241 1.1 riastrad 0x8b10, 0xffffffff, 0x00000000, 242 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 243 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 244 1.1 riastrad 0x88d4, 0xffffffff, 0x00000010, 245 1.1 riastrad 0x8974, 0xffffffff, 0x00000000, 246 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 247 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 248 1.1 riastrad 0x5e78, 0xffffffff, 0x001000f0, 249 1.1 riastrad 0x6104, 0x01000300, 0x00000000, 250 1.1 riastrad 0x5bc0, 0x00300000, 0x00000000, 251 1.1 riastrad 0x7030, 0xffffffff, 0x00000011, 252 1.1 riastrad 0x7c30, 0xffffffff, 0x00000011, 253 1.1 riastrad 0x10830, 0xffffffff, 0x00000011, 254 1.1 riastrad 0x11430, 0xffffffff, 0x00000011, 255 1.1 riastrad 0x12030, 0xffffffff, 0x00000011, 256 1.1 riastrad 0x12c30, 0xffffffff, 0x00000011, 257 1.1 riastrad 0xd02c, 0xffffffff, 0x08421000, 258 1.1 riastrad 0x240c, 0xffffffff, 0x00000380, 259 1.1 riastrad 0x8b24, 0xffffffff, 0x00ff0fff, 260 1.1 riastrad 0x28a4c, 0x06000000, 0x06000000, 261 1.1 riastrad 0x10c, 0x00000001, 0x00000001, 262 1.1 riastrad 0x8d00, 0xffffffff, 0x100e4848, 263 1.1 riastrad 0x8d04, 0xffffffff, 0x00164745, 264 1.1 riastrad 0x8c00, 0xffffffff, 0xe4000003, 265 1.1 riastrad 0x8c04, 0xffffffff, 0x40600060, 266 1.1 riastrad 0x8c08, 0xffffffff, 0x001c001c, 267 1.1 riastrad 0x8cf0, 0xffffffff, 0x08e00620, 268 1.1 riastrad 0x8c20, 0xffffffff, 0x00800080, 269 1.1 riastrad 0x8c24, 0xffffffff, 0x00800080, 270 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 271 1.1 riastrad 0x8c1c, 0xffffffff, 0x00001010, 272 1.1 riastrad 0x28350, 0xffffffff, 0x00000000, 273 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 274 1.1 riastrad 0x5c4, 0xffffffff, 0x00000001, 275 1.1 riastrad 0x9508, 0xffffffff, 0x00000002, 276 1.1 riastrad 0x913c, 0x0000000f, 0x0000000a 277 1.1 riastrad }; 278 1.1 riastrad 279 1.1 riastrad static const u32 evergreen_golden_registers2[] = 280 1.1 riastrad { 281 1.1 riastrad 0x2f4c, 0xffffffff, 0x00000000, 282 1.1 riastrad 0x54f4, 0xffffffff, 0x00000000, 283 1.1 riastrad 0x54f0, 0xffffffff, 0x00000000, 284 1.1 riastrad 0x5498, 0xffffffff, 0x00000000, 285 1.1 riastrad 0x549c, 0xffffffff, 0x00000000, 286 1.1 riastrad 0x5494, 0xffffffff, 0x00000000, 287 1.1 riastrad 0x53cc, 0xffffffff, 0x00000000, 288 1.1 riastrad 0x53c8, 0xffffffff, 0x00000000, 289 1.1 riastrad 0x53c4, 0xffffffff, 0x00000000, 290 1.1 riastrad 0x53c0, 0xffffffff, 0x00000000, 291 1.1 riastrad 0x53bc, 0xffffffff, 0x00000000, 292 1.1 riastrad 0x53b8, 0xffffffff, 0x00000000, 293 1.1 riastrad 0x53b4, 0xffffffff, 0x00000000, 294 1.1 riastrad 0x53b0, 0xffffffff, 0x00000000 295 1.1 riastrad }; 296 1.1 riastrad 297 1.1 riastrad static const u32 cypress_mgcg_init[] = 298 1.1 riastrad { 299 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000, 300 1.1 riastrad 0x5448, 0xffffffff, 0x00000100, 301 1.1 riastrad 0x55e4, 0xffffffff, 0x00000100, 302 1.1 riastrad 0x160c, 0xffffffff, 0x00000100, 303 1.1 riastrad 0x5644, 0xffffffff, 0x00000100, 304 1.1 riastrad 0xc164, 0xffffffff, 0x00000100, 305 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 306 1.1 riastrad 0x897c, 0xffffffff, 0x06000100, 307 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 308 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 309 1.1 riastrad 0x9a60, 0xffffffff, 0x00000100, 310 1.1 riastrad 0x9868, 0xffffffff, 0x00000100, 311 1.1 riastrad 0x8d58, 0xffffffff, 0x00000100, 312 1.1 riastrad 0x9510, 0xffffffff, 0x00000100, 313 1.1 riastrad 0x949c, 0xffffffff, 0x00000100, 314 1.1 riastrad 0x9654, 0xffffffff, 0x00000100, 315 1.1 riastrad 0x9030, 0xffffffff, 0x00000100, 316 1.1 riastrad 0x9034, 0xffffffff, 0x00000100, 317 1.1 riastrad 0x9038, 0xffffffff, 0x00000100, 318 1.1 riastrad 0x903c, 0xffffffff, 0x00000100, 319 1.1 riastrad 0x9040, 0xffffffff, 0x00000100, 320 1.1 riastrad 0xa200, 0xffffffff, 0x00000100, 321 1.1 riastrad 0xa204, 0xffffffff, 0x00000100, 322 1.1 riastrad 0xa208, 0xffffffff, 0x00000100, 323 1.1 riastrad 0xa20c, 0xffffffff, 0x00000100, 324 1.1 riastrad 0x971c, 0xffffffff, 0x00000100, 325 1.1 riastrad 0x977c, 0xffffffff, 0x00000100, 326 1.1 riastrad 0x3f80, 0xffffffff, 0x00000100, 327 1.1 riastrad 0xa210, 0xffffffff, 0x00000100, 328 1.1 riastrad 0xa214, 0xffffffff, 0x00000100, 329 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 330 1.1 riastrad 0x9784, 0xffffffff, 0x00000100, 331 1.1 riastrad 0x9698, 0xffffffff, 0x00000100, 332 1.1 riastrad 0x4d4, 0xffffffff, 0x00000200, 333 1.1 riastrad 0x30cc, 0xffffffff, 0x00000100, 334 1.1 riastrad 0xd0c0, 0xffffffff, 0xff000100, 335 1.1 riastrad 0x802c, 0xffffffff, 0x40000000, 336 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 337 1.1 riastrad 0x9160, 0xffffffff, 0x00030002, 338 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 339 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 340 1.1 riastrad 0x9180, 0xffffffff, 0x00050004, 341 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 342 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 343 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 344 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 345 1.1 riastrad 0x919c, 0xffffffff, 0x00050004, 346 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 347 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 348 1.1 riastrad 0x91b0, 0xffffffff, 0x00070000, 349 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 350 1.1 riastrad 0x91b8, 0xffffffff, 0x00050004, 351 1.1 riastrad 0x91c4, 0xffffffff, 0x00010006, 352 1.1 riastrad 0x91c8, 0xffffffff, 0x00090008, 353 1.1 riastrad 0x91cc, 0xffffffff, 0x00070000, 354 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 355 1.1 riastrad 0x91d4, 0xffffffff, 0x00050004, 356 1.1 riastrad 0x91e0, 0xffffffff, 0x00010006, 357 1.1 riastrad 0x91e4, 0xffffffff, 0x00090008, 358 1.1 riastrad 0x91e8, 0xffffffff, 0x00000000, 359 1.1 riastrad 0x91ec, 0xffffffff, 0x00070000, 360 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 361 1.1 riastrad 0x91f4, 0xffffffff, 0x00050004, 362 1.1 riastrad 0x9200, 0xffffffff, 0x00010006, 363 1.1 riastrad 0x9204, 0xffffffff, 0x00090008, 364 1.1 riastrad 0x9208, 0xffffffff, 0x00070000, 365 1.1 riastrad 0x920c, 0xffffffff, 0x00030002, 366 1.1 riastrad 0x9210, 0xffffffff, 0x00050004, 367 1.1 riastrad 0x921c, 0xffffffff, 0x00010006, 368 1.1 riastrad 0x9220, 0xffffffff, 0x00090008, 369 1.1 riastrad 0x9224, 0xffffffff, 0x00070000, 370 1.1 riastrad 0x9228, 0xffffffff, 0x00030002, 371 1.1 riastrad 0x922c, 0xffffffff, 0x00050004, 372 1.1 riastrad 0x9238, 0xffffffff, 0x00010006, 373 1.1 riastrad 0x923c, 0xffffffff, 0x00090008, 374 1.1 riastrad 0x9240, 0xffffffff, 0x00070000, 375 1.1 riastrad 0x9244, 0xffffffff, 0x00030002, 376 1.1 riastrad 0x9248, 0xffffffff, 0x00050004, 377 1.1 riastrad 0x9254, 0xffffffff, 0x00010006, 378 1.1 riastrad 0x9258, 0xffffffff, 0x00090008, 379 1.1 riastrad 0x925c, 0xffffffff, 0x00070000, 380 1.1 riastrad 0x9260, 0xffffffff, 0x00030002, 381 1.1 riastrad 0x9264, 0xffffffff, 0x00050004, 382 1.1 riastrad 0x9270, 0xffffffff, 0x00010006, 383 1.1 riastrad 0x9274, 0xffffffff, 0x00090008, 384 1.1 riastrad 0x9278, 0xffffffff, 0x00070000, 385 1.1 riastrad 0x927c, 0xffffffff, 0x00030002, 386 1.1 riastrad 0x9280, 0xffffffff, 0x00050004, 387 1.1 riastrad 0x928c, 0xffffffff, 0x00010006, 388 1.1 riastrad 0x9290, 0xffffffff, 0x00090008, 389 1.1 riastrad 0x9294, 0xffffffff, 0x00000000, 390 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 391 1.1 riastrad 0x802c, 0xffffffff, 0x40010000, 392 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 393 1.1 riastrad 0x9160, 0xffffffff, 0x00030002, 394 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 395 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 396 1.1 riastrad 0x9180, 0xffffffff, 0x00050004, 397 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 398 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 399 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 400 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 401 1.1 riastrad 0x919c, 0xffffffff, 0x00050004, 402 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 403 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 404 1.1 riastrad 0x91b0, 0xffffffff, 0x00070000, 405 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 406 1.1 riastrad 0x91b8, 0xffffffff, 0x00050004, 407 1.1 riastrad 0x91c4, 0xffffffff, 0x00010006, 408 1.1 riastrad 0x91c8, 0xffffffff, 0x00090008, 409 1.1 riastrad 0x91cc, 0xffffffff, 0x00070000, 410 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 411 1.1 riastrad 0x91d4, 0xffffffff, 0x00050004, 412 1.1 riastrad 0x91e0, 0xffffffff, 0x00010006, 413 1.1 riastrad 0x91e4, 0xffffffff, 0x00090008, 414 1.1 riastrad 0x91e8, 0xffffffff, 0x00000000, 415 1.1 riastrad 0x91ec, 0xffffffff, 0x00070000, 416 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 417 1.1 riastrad 0x91f4, 0xffffffff, 0x00050004, 418 1.1 riastrad 0x9200, 0xffffffff, 0x00010006, 419 1.1 riastrad 0x9204, 0xffffffff, 0x00090008, 420 1.1 riastrad 0x9208, 0xffffffff, 0x00070000, 421 1.1 riastrad 0x920c, 0xffffffff, 0x00030002, 422 1.1 riastrad 0x9210, 0xffffffff, 0x00050004, 423 1.1 riastrad 0x921c, 0xffffffff, 0x00010006, 424 1.1 riastrad 0x9220, 0xffffffff, 0x00090008, 425 1.1 riastrad 0x9224, 0xffffffff, 0x00070000, 426 1.1 riastrad 0x9228, 0xffffffff, 0x00030002, 427 1.1 riastrad 0x922c, 0xffffffff, 0x00050004, 428 1.1 riastrad 0x9238, 0xffffffff, 0x00010006, 429 1.1 riastrad 0x923c, 0xffffffff, 0x00090008, 430 1.1 riastrad 0x9240, 0xffffffff, 0x00070000, 431 1.1 riastrad 0x9244, 0xffffffff, 0x00030002, 432 1.1 riastrad 0x9248, 0xffffffff, 0x00050004, 433 1.1 riastrad 0x9254, 0xffffffff, 0x00010006, 434 1.1 riastrad 0x9258, 0xffffffff, 0x00090008, 435 1.1 riastrad 0x925c, 0xffffffff, 0x00070000, 436 1.1 riastrad 0x9260, 0xffffffff, 0x00030002, 437 1.1 riastrad 0x9264, 0xffffffff, 0x00050004, 438 1.1 riastrad 0x9270, 0xffffffff, 0x00010006, 439 1.1 riastrad 0x9274, 0xffffffff, 0x00090008, 440 1.1 riastrad 0x9278, 0xffffffff, 0x00070000, 441 1.1 riastrad 0x927c, 0xffffffff, 0x00030002, 442 1.1 riastrad 0x9280, 0xffffffff, 0x00050004, 443 1.1 riastrad 0x928c, 0xffffffff, 0x00010006, 444 1.1 riastrad 0x9290, 0xffffffff, 0x00090008, 445 1.1 riastrad 0x9294, 0xffffffff, 0x00000000, 446 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 447 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000 448 1.1 riastrad }; 449 1.1 riastrad 450 1.1 riastrad static const u32 redwood_mgcg_init[] = 451 1.1 riastrad { 452 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000, 453 1.1 riastrad 0x5448, 0xffffffff, 0x00000100, 454 1.1 riastrad 0x55e4, 0xffffffff, 0x00000100, 455 1.1 riastrad 0x160c, 0xffffffff, 0x00000100, 456 1.1 riastrad 0x5644, 0xffffffff, 0x00000100, 457 1.1 riastrad 0xc164, 0xffffffff, 0x00000100, 458 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 459 1.1 riastrad 0x897c, 0xffffffff, 0x06000100, 460 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 461 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 462 1.1 riastrad 0x9a60, 0xffffffff, 0x00000100, 463 1.1 riastrad 0x9868, 0xffffffff, 0x00000100, 464 1.1 riastrad 0x8d58, 0xffffffff, 0x00000100, 465 1.1 riastrad 0x9510, 0xffffffff, 0x00000100, 466 1.1 riastrad 0x949c, 0xffffffff, 0x00000100, 467 1.1 riastrad 0x9654, 0xffffffff, 0x00000100, 468 1.1 riastrad 0x9030, 0xffffffff, 0x00000100, 469 1.1 riastrad 0x9034, 0xffffffff, 0x00000100, 470 1.1 riastrad 0x9038, 0xffffffff, 0x00000100, 471 1.1 riastrad 0x903c, 0xffffffff, 0x00000100, 472 1.1 riastrad 0x9040, 0xffffffff, 0x00000100, 473 1.1 riastrad 0xa200, 0xffffffff, 0x00000100, 474 1.1 riastrad 0xa204, 0xffffffff, 0x00000100, 475 1.1 riastrad 0xa208, 0xffffffff, 0x00000100, 476 1.1 riastrad 0xa20c, 0xffffffff, 0x00000100, 477 1.1 riastrad 0x971c, 0xffffffff, 0x00000100, 478 1.1 riastrad 0x977c, 0xffffffff, 0x00000100, 479 1.1 riastrad 0x3f80, 0xffffffff, 0x00000100, 480 1.1 riastrad 0xa210, 0xffffffff, 0x00000100, 481 1.1 riastrad 0xa214, 0xffffffff, 0x00000100, 482 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 483 1.1 riastrad 0x9784, 0xffffffff, 0x00000100, 484 1.1 riastrad 0x9698, 0xffffffff, 0x00000100, 485 1.1 riastrad 0x4d4, 0xffffffff, 0x00000200, 486 1.1 riastrad 0x30cc, 0xffffffff, 0x00000100, 487 1.1 riastrad 0xd0c0, 0xffffffff, 0xff000100, 488 1.1 riastrad 0x802c, 0xffffffff, 0x40000000, 489 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 490 1.1 riastrad 0x9160, 0xffffffff, 0x00030002, 491 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 492 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 493 1.1 riastrad 0x9180, 0xffffffff, 0x00050004, 494 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 495 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 496 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 497 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 498 1.1 riastrad 0x919c, 0xffffffff, 0x00050004, 499 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 500 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 501 1.1 riastrad 0x91b0, 0xffffffff, 0x00070000, 502 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 503 1.1 riastrad 0x91b8, 0xffffffff, 0x00050004, 504 1.1 riastrad 0x91c4, 0xffffffff, 0x00010006, 505 1.1 riastrad 0x91c8, 0xffffffff, 0x00090008, 506 1.1 riastrad 0x91cc, 0xffffffff, 0x00070000, 507 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 508 1.1 riastrad 0x91d4, 0xffffffff, 0x00050004, 509 1.1 riastrad 0x91e0, 0xffffffff, 0x00010006, 510 1.1 riastrad 0x91e4, 0xffffffff, 0x00090008, 511 1.1 riastrad 0x91e8, 0xffffffff, 0x00000000, 512 1.1 riastrad 0x91ec, 0xffffffff, 0x00070000, 513 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 514 1.1 riastrad 0x91f4, 0xffffffff, 0x00050004, 515 1.1 riastrad 0x9200, 0xffffffff, 0x00010006, 516 1.1 riastrad 0x9204, 0xffffffff, 0x00090008, 517 1.1 riastrad 0x9294, 0xffffffff, 0x00000000, 518 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 519 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000 520 1.1 riastrad }; 521 1.1 riastrad 522 1.1 riastrad static const u32 cedar_golden_registers[] = 523 1.1 riastrad { 524 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 525 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 526 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 527 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 528 1.1 riastrad 0x9b7c, 0xffffffff, 0x00000000, 529 1.1 riastrad 0x8a14, 0xffffffff, 0x00000007, 530 1.1 riastrad 0x8b10, 0xffffffff, 0x00000000, 531 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 532 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 533 1.1 riastrad 0x88d4, 0xffffffff, 0x00000000, 534 1.1 riastrad 0x8974, 0xffffffff, 0x00000000, 535 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 536 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 537 1.1 riastrad 0x5e78, 0xffffffff, 0x001000f0, 538 1.1 riastrad 0x6104, 0x01000300, 0x00000000, 539 1.1 riastrad 0x5bc0, 0x00300000, 0x00000000, 540 1.1 riastrad 0x7030, 0xffffffff, 0x00000011, 541 1.1 riastrad 0x7c30, 0xffffffff, 0x00000011, 542 1.1 riastrad 0x10830, 0xffffffff, 0x00000011, 543 1.1 riastrad 0x11430, 0xffffffff, 0x00000011, 544 1.1 riastrad 0xd02c, 0xffffffff, 0x08421000, 545 1.1 riastrad 0x240c, 0xffffffff, 0x00000380, 546 1.1 riastrad 0x8b24, 0xffffffff, 0x00ff0fff, 547 1.1 riastrad 0x28a4c, 0x06000000, 0x06000000, 548 1.1 riastrad 0x10c, 0x00000001, 0x00000001, 549 1.1 riastrad 0x8d00, 0xffffffff, 0x100e4848, 550 1.1 riastrad 0x8d04, 0xffffffff, 0x00164745, 551 1.1 riastrad 0x8c00, 0xffffffff, 0xe4000003, 552 1.1 riastrad 0x8c04, 0xffffffff, 0x40600060, 553 1.1 riastrad 0x8c08, 0xffffffff, 0x001c001c, 554 1.1 riastrad 0x8cf0, 0xffffffff, 0x08e00410, 555 1.1 riastrad 0x8c20, 0xffffffff, 0x00800080, 556 1.1 riastrad 0x8c24, 0xffffffff, 0x00800080, 557 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 558 1.1 riastrad 0x8c1c, 0xffffffff, 0x00001010, 559 1.1 riastrad 0x28350, 0xffffffff, 0x00000000, 560 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 561 1.1 riastrad 0x5c4, 0xffffffff, 0x00000001, 562 1.1 riastrad 0x9508, 0xffffffff, 0x00000002 563 1.1 riastrad }; 564 1.1 riastrad 565 1.1 riastrad static const u32 cedar_mgcg_init[] = 566 1.1 riastrad { 567 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000, 568 1.1 riastrad 0x5448, 0xffffffff, 0x00000100, 569 1.1 riastrad 0x55e4, 0xffffffff, 0x00000100, 570 1.1 riastrad 0x160c, 0xffffffff, 0x00000100, 571 1.1 riastrad 0x5644, 0xffffffff, 0x00000100, 572 1.1 riastrad 0xc164, 0xffffffff, 0x00000100, 573 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 574 1.1 riastrad 0x897c, 0xffffffff, 0x06000100, 575 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 576 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 577 1.1 riastrad 0x9a60, 0xffffffff, 0x00000100, 578 1.1 riastrad 0x9868, 0xffffffff, 0x00000100, 579 1.1 riastrad 0x8d58, 0xffffffff, 0x00000100, 580 1.1 riastrad 0x9510, 0xffffffff, 0x00000100, 581 1.1 riastrad 0x949c, 0xffffffff, 0x00000100, 582 1.1 riastrad 0x9654, 0xffffffff, 0x00000100, 583 1.1 riastrad 0x9030, 0xffffffff, 0x00000100, 584 1.1 riastrad 0x9034, 0xffffffff, 0x00000100, 585 1.1 riastrad 0x9038, 0xffffffff, 0x00000100, 586 1.1 riastrad 0x903c, 0xffffffff, 0x00000100, 587 1.1 riastrad 0x9040, 0xffffffff, 0x00000100, 588 1.1 riastrad 0xa200, 0xffffffff, 0x00000100, 589 1.1 riastrad 0xa204, 0xffffffff, 0x00000100, 590 1.1 riastrad 0xa208, 0xffffffff, 0x00000100, 591 1.1 riastrad 0xa20c, 0xffffffff, 0x00000100, 592 1.1 riastrad 0x971c, 0xffffffff, 0x00000100, 593 1.1 riastrad 0x977c, 0xffffffff, 0x00000100, 594 1.1 riastrad 0x3f80, 0xffffffff, 0x00000100, 595 1.1 riastrad 0xa210, 0xffffffff, 0x00000100, 596 1.1 riastrad 0xa214, 0xffffffff, 0x00000100, 597 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 598 1.1 riastrad 0x9784, 0xffffffff, 0x00000100, 599 1.1 riastrad 0x9698, 0xffffffff, 0x00000100, 600 1.1 riastrad 0x4d4, 0xffffffff, 0x00000200, 601 1.1 riastrad 0x30cc, 0xffffffff, 0x00000100, 602 1.1 riastrad 0xd0c0, 0xffffffff, 0xff000100, 603 1.1 riastrad 0x802c, 0xffffffff, 0x40000000, 604 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 605 1.1 riastrad 0x9178, 0xffffffff, 0x00050000, 606 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 607 1.1 riastrad 0x918c, 0xffffffff, 0x00010004, 608 1.1 riastrad 0x9190, 0xffffffff, 0x00070006, 609 1.1 riastrad 0x9194, 0xffffffff, 0x00050000, 610 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 611 1.1 riastrad 0x91a8, 0xffffffff, 0x00010004, 612 1.1 riastrad 0x91ac, 0xffffffff, 0x00070006, 613 1.1 riastrad 0x91e8, 0xffffffff, 0x00000000, 614 1.1 riastrad 0x9294, 0xffffffff, 0x00000000, 615 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 616 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000 617 1.1 riastrad }; 618 1.1 riastrad 619 1.1 riastrad static const u32 juniper_mgcg_init[] = 620 1.1 riastrad { 621 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000, 622 1.1 riastrad 0x5448, 0xffffffff, 0x00000100, 623 1.1 riastrad 0x55e4, 0xffffffff, 0x00000100, 624 1.1 riastrad 0x160c, 0xffffffff, 0x00000100, 625 1.1 riastrad 0x5644, 0xffffffff, 0x00000100, 626 1.1 riastrad 0xc164, 0xffffffff, 0x00000100, 627 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 628 1.1 riastrad 0x897c, 0xffffffff, 0x06000100, 629 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 630 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 631 1.1 riastrad 0x9a60, 0xffffffff, 0x00000100, 632 1.1 riastrad 0x9868, 0xffffffff, 0x00000100, 633 1.1 riastrad 0x8d58, 0xffffffff, 0x00000100, 634 1.1 riastrad 0x9510, 0xffffffff, 0x00000100, 635 1.1 riastrad 0x949c, 0xffffffff, 0x00000100, 636 1.1 riastrad 0x9654, 0xffffffff, 0x00000100, 637 1.1 riastrad 0x9030, 0xffffffff, 0x00000100, 638 1.1 riastrad 0x9034, 0xffffffff, 0x00000100, 639 1.1 riastrad 0x9038, 0xffffffff, 0x00000100, 640 1.1 riastrad 0x903c, 0xffffffff, 0x00000100, 641 1.1 riastrad 0x9040, 0xffffffff, 0x00000100, 642 1.1 riastrad 0xa200, 0xffffffff, 0x00000100, 643 1.1 riastrad 0xa204, 0xffffffff, 0x00000100, 644 1.1 riastrad 0xa208, 0xffffffff, 0x00000100, 645 1.1 riastrad 0xa20c, 0xffffffff, 0x00000100, 646 1.1 riastrad 0x971c, 0xffffffff, 0x00000100, 647 1.1 riastrad 0xd0c0, 0xffffffff, 0xff000100, 648 1.1 riastrad 0x802c, 0xffffffff, 0x40000000, 649 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 650 1.1 riastrad 0x9160, 0xffffffff, 0x00030002, 651 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 652 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 653 1.1 riastrad 0x9180, 0xffffffff, 0x00050004, 654 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 655 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 656 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 657 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 658 1.1 riastrad 0x919c, 0xffffffff, 0x00050004, 659 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 660 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 661 1.1 riastrad 0x91b0, 0xffffffff, 0x00070000, 662 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 663 1.1 riastrad 0x91b8, 0xffffffff, 0x00050004, 664 1.1 riastrad 0x91c4, 0xffffffff, 0x00010006, 665 1.1 riastrad 0x91c8, 0xffffffff, 0x00090008, 666 1.1 riastrad 0x91cc, 0xffffffff, 0x00070000, 667 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 668 1.1 riastrad 0x91d4, 0xffffffff, 0x00050004, 669 1.1 riastrad 0x91e0, 0xffffffff, 0x00010006, 670 1.1 riastrad 0x91e4, 0xffffffff, 0x00090008, 671 1.1 riastrad 0x91e8, 0xffffffff, 0x00000000, 672 1.1 riastrad 0x91ec, 0xffffffff, 0x00070000, 673 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 674 1.1 riastrad 0x91f4, 0xffffffff, 0x00050004, 675 1.1 riastrad 0x9200, 0xffffffff, 0x00010006, 676 1.1 riastrad 0x9204, 0xffffffff, 0x00090008, 677 1.1 riastrad 0x9208, 0xffffffff, 0x00070000, 678 1.1 riastrad 0x920c, 0xffffffff, 0x00030002, 679 1.1 riastrad 0x9210, 0xffffffff, 0x00050004, 680 1.1 riastrad 0x921c, 0xffffffff, 0x00010006, 681 1.1 riastrad 0x9220, 0xffffffff, 0x00090008, 682 1.1 riastrad 0x9224, 0xffffffff, 0x00070000, 683 1.1 riastrad 0x9228, 0xffffffff, 0x00030002, 684 1.1 riastrad 0x922c, 0xffffffff, 0x00050004, 685 1.1 riastrad 0x9238, 0xffffffff, 0x00010006, 686 1.1 riastrad 0x923c, 0xffffffff, 0x00090008, 687 1.1 riastrad 0x9240, 0xffffffff, 0x00070000, 688 1.1 riastrad 0x9244, 0xffffffff, 0x00030002, 689 1.1 riastrad 0x9248, 0xffffffff, 0x00050004, 690 1.1 riastrad 0x9254, 0xffffffff, 0x00010006, 691 1.1 riastrad 0x9258, 0xffffffff, 0x00090008, 692 1.1 riastrad 0x925c, 0xffffffff, 0x00070000, 693 1.1 riastrad 0x9260, 0xffffffff, 0x00030002, 694 1.1 riastrad 0x9264, 0xffffffff, 0x00050004, 695 1.1 riastrad 0x9270, 0xffffffff, 0x00010006, 696 1.1 riastrad 0x9274, 0xffffffff, 0x00090008, 697 1.1 riastrad 0x9278, 0xffffffff, 0x00070000, 698 1.1 riastrad 0x927c, 0xffffffff, 0x00030002, 699 1.1 riastrad 0x9280, 0xffffffff, 0x00050004, 700 1.1 riastrad 0x928c, 0xffffffff, 0x00010006, 701 1.1 riastrad 0x9290, 0xffffffff, 0x00090008, 702 1.1 riastrad 0x9294, 0xffffffff, 0x00000000, 703 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 704 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000, 705 1.1 riastrad 0x977c, 0xffffffff, 0x00000100, 706 1.1 riastrad 0x3f80, 0xffffffff, 0x00000100, 707 1.1 riastrad 0xa210, 0xffffffff, 0x00000100, 708 1.1 riastrad 0xa214, 0xffffffff, 0x00000100, 709 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 710 1.1 riastrad 0x9784, 0xffffffff, 0x00000100, 711 1.1 riastrad 0x9698, 0xffffffff, 0x00000100, 712 1.1 riastrad 0x4d4, 0xffffffff, 0x00000200, 713 1.1 riastrad 0x30cc, 0xffffffff, 0x00000100, 714 1.1 riastrad 0x802c, 0xffffffff, 0xc0000000 715 1.1 riastrad }; 716 1.1 riastrad 717 1.1 riastrad static const u32 supersumo_golden_registers[] = 718 1.1 riastrad { 719 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 720 1.1 riastrad 0x5c4, 0xffffffff, 0x00000001, 721 1.1 riastrad 0x7030, 0xffffffff, 0x00000011, 722 1.1 riastrad 0x7c30, 0xffffffff, 0x00000011, 723 1.1 riastrad 0x6104, 0x01000300, 0x00000000, 724 1.1 riastrad 0x5bc0, 0x00300000, 0x00000000, 725 1.1 riastrad 0x8c04, 0xffffffff, 0x40600060, 726 1.1 riastrad 0x8c08, 0xffffffff, 0x001c001c, 727 1.1 riastrad 0x8c20, 0xffffffff, 0x00800080, 728 1.1 riastrad 0x8c24, 0xffffffff, 0x00800080, 729 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 730 1.1 riastrad 0x8c1c, 0xffffffff, 0x00001010, 731 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 732 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 733 1.1 riastrad 0x91c4, 0xffffffff, 0x00010006, 734 1.1 riastrad 0x91e0, 0xffffffff, 0x00010006, 735 1.1 riastrad 0x9200, 0xffffffff, 0x00010006, 736 1.1 riastrad 0x9150, 0xffffffff, 0x6e944040, 737 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 738 1.1 riastrad 0x9180, 0xffffffff, 0x00050004, 739 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 740 1.1 riastrad 0x919c, 0xffffffff, 0x00050004, 741 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 742 1.1 riastrad 0x91b8, 0xffffffff, 0x00050004, 743 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 744 1.1 riastrad 0x91d4, 0xffffffff, 0x00050004, 745 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 746 1.1 riastrad 0x91f4, 0xffffffff, 0x00050004, 747 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 748 1.1 riastrad 0x9160, 0xffffffff, 0x00030002, 749 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 750 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 751 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 752 1.1 riastrad 0x91b0, 0xffffffff, 0x00070000, 753 1.1 riastrad 0x91cc, 0xffffffff, 0x00070000, 754 1.1 riastrad 0x91ec, 0xffffffff, 0x00070000, 755 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 756 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 757 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 758 1.1 riastrad 0x91c8, 0xffffffff, 0x00090008, 759 1.1 riastrad 0x91e4, 0xffffffff, 0x00090008, 760 1.1 riastrad 0x9204, 0xffffffff, 0x00090008, 761 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 762 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 763 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 764 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 765 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 766 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 767 1.1 riastrad 0x5644, 0xffffffff, 0x00000100, 768 1.1 riastrad 0x9b7c, 0xffffffff, 0x00000000, 769 1.1 riastrad 0x8030, 0xffffffff, 0x0000100a, 770 1.1 riastrad 0x8a14, 0xffffffff, 0x00000007, 771 1.1 riastrad 0x8b24, 0xffffffff, 0x00ff0fff, 772 1.1 riastrad 0x8b10, 0xffffffff, 0x00000000, 773 1.1 riastrad 0x28a4c, 0x06000000, 0x06000000, 774 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 775 1.1 riastrad 0x913c, 0xffff000f, 0x0100000a, 776 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 777 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 778 1.1 riastrad 0x88d4, 0xffffffff, 0x00000010, 779 1.1 riastrad 0x8974, 0xffffffff, 0x00000000, 780 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 781 1.1 riastrad 0x5e78, 0xffffffff, 0x001000f0, 782 1.1 riastrad 0xd02c, 0xffffffff, 0x08421000, 783 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 784 1.1 riastrad 0x8d00, 0xffffffff, 0x100e4848, 785 1.1 riastrad 0x8d04, 0xffffffff, 0x00164745, 786 1.1 riastrad 0x8c00, 0xffffffff, 0xe4000003, 787 1.1 riastrad 0x8cf0, 0x1fffffff, 0x08e00620, 788 1.1 riastrad 0x28350, 0xffffffff, 0x00000000, 789 1.1 riastrad 0x9508, 0xffffffff, 0x00000002 790 1.1 riastrad }; 791 1.1 riastrad 792 1.1 riastrad static const u32 sumo_golden_registers[] = 793 1.1 riastrad { 794 1.1 riastrad 0x900c, 0x00ffffff, 0x0017071f, 795 1.1 riastrad 0x8c18, 0xffffffff, 0x10101060, 796 1.1 riastrad 0x8c1c, 0xffffffff, 0x00001010, 797 1.1 riastrad 0x8c30, 0x0000000f, 0x00000005, 798 1.1 riastrad 0x9688, 0x0000000f, 0x00000007 799 1.1 riastrad }; 800 1.1 riastrad 801 1.1 riastrad static const u32 wrestler_golden_registers[] = 802 1.1 riastrad { 803 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 804 1.1 riastrad 0x5c4, 0xffffffff, 0x00000001, 805 1.1 riastrad 0x7030, 0xffffffff, 0x00000011, 806 1.1 riastrad 0x7c30, 0xffffffff, 0x00000011, 807 1.1 riastrad 0x6104, 0x01000300, 0x00000000, 808 1.1 riastrad 0x5bc0, 0x00300000, 0x00000000, 809 1.1 riastrad 0x918c, 0xffffffff, 0x00010006, 810 1.1 riastrad 0x91a8, 0xffffffff, 0x00010006, 811 1.1 riastrad 0x9150, 0xffffffff, 0x6e944040, 812 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 813 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 814 1.1 riastrad 0x915c, 0xffffffff, 0x00010000, 815 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 816 1.1 riastrad 0x9178, 0xffffffff, 0x00070000, 817 1.1 riastrad 0x9194, 0xffffffff, 0x00070000, 818 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 819 1.1 riastrad 0x9190, 0xffffffff, 0x00090008, 820 1.1 riastrad 0x91ac, 0xffffffff, 0x00090008, 821 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 822 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 823 1.1 riastrad 0x929c, 0xffffffff, 0x00000001, 824 1.1 riastrad 0x8a18, 0xffffffff, 0x00000100, 825 1.1 riastrad 0x8b28, 0xffffffff, 0x00000100, 826 1.1 riastrad 0x9144, 0xffffffff, 0x00000100, 827 1.1 riastrad 0x9b7c, 0xffffffff, 0x00000000, 828 1.1 riastrad 0x8030, 0xffffffff, 0x0000100a, 829 1.1 riastrad 0x8a14, 0xffffffff, 0x00000001, 830 1.1 riastrad 0x8b24, 0xffffffff, 0x00ff0fff, 831 1.1 riastrad 0x8b10, 0xffffffff, 0x00000000, 832 1.1 riastrad 0x28a4c, 0x06000000, 0x06000000, 833 1.1 riastrad 0x4d8, 0xffffffff, 0x00000100, 834 1.1 riastrad 0x913c, 0xffff000f, 0x0100000a, 835 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 836 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 837 1.1 riastrad 0x88d4, 0xffffffff, 0x00000010, 838 1.1 riastrad 0x8974, 0xffffffff, 0x00000000, 839 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 840 1.1 riastrad 0x5e78, 0xffffffff, 0x001000f0, 841 1.1 riastrad 0xd02c, 0xffffffff, 0x08421000, 842 1.1 riastrad 0xa008, 0xffffffff, 0x00010000, 843 1.1 riastrad 0x8d00, 0xffffffff, 0x100e4848, 844 1.1 riastrad 0x8d04, 0xffffffff, 0x00164745, 845 1.1 riastrad 0x8c00, 0xffffffff, 0xe4000003, 846 1.1 riastrad 0x8cf0, 0x1fffffff, 0x08e00410, 847 1.1 riastrad 0x28350, 0xffffffff, 0x00000000, 848 1.1 riastrad 0x9508, 0xffffffff, 0x00000002, 849 1.1 riastrad 0x900c, 0xffffffff, 0x0017071f, 850 1.1 riastrad 0x8c18, 0xffffffff, 0x10101060, 851 1.1 riastrad 0x8c1c, 0xffffffff, 0x00001010 852 1.1 riastrad }; 853 1.1 riastrad 854 1.1 riastrad static const u32 barts_golden_registers[] = 855 1.1 riastrad { 856 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 857 1.1 riastrad 0x5e78, 0x8f311ff1, 0x001000f0, 858 1.1 riastrad 0x3f90, 0xffff0000, 0xff000000, 859 1.1 riastrad 0x9148, 0xffff0000, 0xff000000, 860 1.1 riastrad 0x3f94, 0xffff0000, 0xff000000, 861 1.1 riastrad 0x914c, 0xffff0000, 0xff000000, 862 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 863 1.1 riastrad 0xbd4, 0x70073777, 0x00010001, 864 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 865 1.1 riastrad 0xd0b8, 0x03773777, 0x02011003, 866 1.1 riastrad 0x5bc0, 0x00200000, 0x50100000, 867 1.1 riastrad 0x98f8, 0x33773777, 0x02011003, 868 1.1 riastrad 0x98fc, 0xffffffff, 0x76543210, 869 1.1 riastrad 0x7030, 0x31000311, 0x00000011, 870 1.1 riastrad 0x2f48, 0x00000007, 0x02011003, 871 1.1 riastrad 0x6b28, 0x00000010, 0x00000012, 872 1.1 riastrad 0x7728, 0x00000010, 0x00000012, 873 1.1 riastrad 0x10328, 0x00000010, 0x00000012, 874 1.1 riastrad 0x10f28, 0x00000010, 0x00000012, 875 1.1 riastrad 0x11b28, 0x00000010, 0x00000012, 876 1.1 riastrad 0x12728, 0x00000010, 0x00000012, 877 1.1 riastrad 0x240c, 0x000007ff, 0x00000380, 878 1.1 riastrad 0x8a14, 0xf000001f, 0x00000007, 879 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 880 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 881 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 882 1.1 riastrad 0x10c, 0x00000001, 0x00010003, 883 1.1 riastrad 0xa02c, 0xffffffff, 0x0000009b, 884 1.1 riastrad 0x913c, 0x0000000f, 0x0100000a, 885 1.1 riastrad 0x8d00, 0xffff7f7f, 0x100e4848, 886 1.1 riastrad 0x8d04, 0x00ffffff, 0x00164745, 887 1.1 riastrad 0x8c00, 0xfffc0003, 0xe4000003, 888 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 889 1.1 riastrad 0x8c08, 0x00ff00ff, 0x001c001c, 890 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00620, 891 1.1 riastrad 0x8c20, 0x0fff0fff, 0x00800080, 892 1.1 riastrad 0x8c24, 0x0fff0fff, 0x00800080, 893 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 894 1.1 riastrad 0x8c1c, 0x0000ffff, 0x00001010, 895 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 896 1.1 riastrad 0x9508, 0x3700001f, 0x00000002, 897 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 898 1.1 riastrad 0x88c4, 0x001f3ae3, 0x000000c2, 899 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 900 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 901 1.1 riastrad }; 902 1.1 riastrad 903 1.1 riastrad static const u32 turks_golden_registers[] = 904 1.1 riastrad { 905 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 906 1.1 riastrad 0x5e78, 0x8f311ff1, 0x001000f0, 907 1.1 riastrad 0x8c8, 0x00003000, 0x00001070, 908 1.1 riastrad 0x8cc, 0x000fffff, 0x00040035, 909 1.1 riastrad 0x3f90, 0xffff0000, 0xfff00000, 910 1.1 riastrad 0x9148, 0xffff0000, 0xfff00000, 911 1.1 riastrad 0x3f94, 0xffff0000, 0xfff00000, 912 1.1 riastrad 0x914c, 0xffff0000, 0xfff00000, 913 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 914 1.1 riastrad 0xbd4, 0x00073007, 0x00010002, 915 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 916 1.1 riastrad 0xd0b8, 0x03773777, 0x02010002, 917 1.1 riastrad 0x5bc0, 0x00200000, 0x50100000, 918 1.1 riastrad 0x98f8, 0x33773777, 0x00010002, 919 1.1 riastrad 0x98fc, 0xffffffff, 0x33221100, 920 1.1 riastrad 0x7030, 0x31000311, 0x00000011, 921 1.1 riastrad 0x2f48, 0x33773777, 0x00010002, 922 1.1 riastrad 0x6b28, 0x00000010, 0x00000012, 923 1.1 riastrad 0x7728, 0x00000010, 0x00000012, 924 1.1 riastrad 0x10328, 0x00000010, 0x00000012, 925 1.1 riastrad 0x10f28, 0x00000010, 0x00000012, 926 1.1 riastrad 0x11b28, 0x00000010, 0x00000012, 927 1.1 riastrad 0x12728, 0x00000010, 0x00000012, 928 1.1 riastrad 0x240c, 0x000007ff, 0x00000380, 929 1.1 riastrad 0x8a14, 0xf000001f, 0x00000007, 930 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 931 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 932 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 933 1.1 riastrad 0x10c, 0x00000001, 0x00010003, 934 1.1 riastrad 0xa02c, 0xffffffff, 0x0000009b, 935 1.1 riastrad 0x913c, 0x0000000f, 0x0100000a, 936 1.1 riastrad 0x8d00, 0xffff7f7f, 0x100e4848, 937 1.1 riastrad 0x8d04, 0x00ffffff, 0x00164745, 938 1.1 riastrad 0x8c00, 0xfffc0003, 0xe4000003, 939 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 940 1.1 riastrad 0x8c08, 0x00ff00ff, 0x001c001c, 941 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00410, 942 1.1 riastrad 0x8c20, 0x0fff0fff, 0x00800080, 943 1.1 riastrad 0x8c24, 0x0fff0fff, 0x00800080, 944 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 945 1.1 riastrad 0x8c1c, 0x0000ffff, 0x00001010, 946 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 947 1.1 riastrad 0x9508, 0x3700001f, 0x00000002, 948 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 949 1.1 riastrad 0x88c4, 0x001f3ae3, 0x000000c2, 950 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 951 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 952 1.1 riastrad }; 953 1.1 riastrad 954 1.1 riastrad static const u32 caicos_golden_registers[] = 955 1.1 riastrad { 956 1.1 riastrad 0x5eb4, 0xffffffff, 0x00000002, 957 1.1 riastrad 0x5e78, 0x8f311ff1, 0x001000f0, 958 1.1 riastrad 0x8c8, 0x00003420, 0x00001450, 959 1.1 riastrad 0x8cc, 0x000fffff, 0x00040035, 960 1.1 riastrad 0x3f90, 0xffff0000, 0xfffc0000, 961 1.1 riastrad 0x9148, 0xffff0000, 0xfffc0000, 962 1.1 riastrad 0x3f94, 0xffff0000, 0xfffc0000, 963 1.1 riastrad 0x914c, 0xffff0000, 0xfffc0000, 964 1.1 riastrad 0xc78, 0x00000080, 0x00000080, 965 1.1 riastrad 0xbd4, 0x00073007, 0x00010001, 966 1.1 riastrad 0xd02c, 0xbfffff1f, 0x08421000, 967 1.1 riastrad 0xd0b8, 0x03773777, 0x02010001, 968 1.1 riastrad 0x5bc0, 0x00200000, 0x50100000, 969 1.1 riastrad 0x98f8, 0x33773777, 0x02010001, 970 1.1 riastrad 0x98fc, 0xffffffff, 0x33221100, 971 1.1 riastrad 0x7030, 0x31000311, 0x00000011, 972 1.1 riastrad 0x2f48, 0x33773777, 0x02010001, 973 1.1 riastrad 0x6b28, 0x00000010, 0x00000012, 974 1.1 riastrad 0x7728, 0x00000010, 0x00000012, 975 1.1 riastrad 0x10328, 0x00000010, 0x00000012, 976 1.1 riastrad 0x10f28, 0x00000010, 0x00000012, 977 1.1 riastrad 0x11b28, 0x00000010, 0x00000012, 978 1.1 riastrad 0x12728, 0x00000010, 0x00000012, 979 1.1 riastrad 0x240c, 0x000007ff, 0x00000380, 980 1.1 riastrad 0x8a14, 0xf000001f, 0x00000001, 981 1.1 riastrad 0x8b24, 0x3fff3fff, 0x00ff0fff, 982 1.1 riastrad 0x8b10, 0x0000ff0f, 0x00000000, 983 1.1 riastrad 0x28a4c, 0x07ffffff, 0x06000000, 984 1.1 riastrad 0x10c, 0x00000001, 0x00010003, 985 1.1 riastrad 0xa02c, 0xffffffff, 0x0000009b, 986 1.1 riastrad 0x913c, 0x0000000f, 0x0100000a, 987 1.1 riastrad 0x8d00, 0xffff7f7f, 0x100e4848, 988 1.1 riastrad 0x8d04, 0x00ffffff, 0x00164745, 989 1.1 riastrad 0x8c00, 0xfffc0003, 0xe4000003, 990 1.1 riastrad 0x8c04, 0xf8ff00ff, 0x40600060, 991 1.1 riastrad 0x8c08, 0x00ff00ff, 0x001c001c, 992 1.1 riastrad 0x8cf0, 0x1fff1fff, 0x08e00410, 993 1.1 riastrad 0x8c20, 0x0fff0fff, 0x00800080, 994 1.1 riastrad 0x8c24, 0x0fff0fff, 0x00800080, 995 1.1 riastrad 0x8c18, 0xffffffff, 0x20202078, 996 1.1 riastrad 0x8c1c, 0x0000ffff, 0x00001010, 997 1.1 riastrad 0x28350, 0x00000f01, 0x00000000, 998 1.1 riastrad 0x9508, 0x3700001f, 0x00000002, 999 1.1 riastrad 0x960c, 0xffffffff, 0x54763210, 1000 1.1 riastrad 0x88c4, 0x001f3ae3, 0x000000c2, 1001 1.1 riastrad 0x88d4, 0x0000001f, 0x00000010, 1002 1.1 riastrad 0x8974, 0xffffffff, 0x00000000 1003 1.1 riastrad }; 1004 1.1 riastrad 1005 1.1 riastrad static void evergreen_init_golden_registers(struct radeon_device *rdev) 1006 1.1 riastrad { 1007 1.1 riastrad switch (rdev->family) { 1008 1.1 riastrad case CHIP_CYPRESS: 1009 1.1 riastrad case CHIP_HEMLOCK: 1010 1.1 riastrad radeon_program_register_sequence(rdev, 1011 1.1 riastrad evergreen_golden_registers, 1012 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers)); 1013 1.1 riastrad radeon_program_register_sequence(rdev, 1014 1.1 riastrad evergreen_golden_registers2, 1015 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers2)); 1016 1.1 riastrad radeon_program_register_sequence(rdev, 1017 1.1 riastrad cypress_mgcg_init, 1018 1.1 riastrad (const u32)ARRAY_SIZE(cypress_mgcg_init)); 1019 1.1 riastrad break; 1020 1.1 riastrad case CHIP_JUNIPER: 1021 1.1 riastrad radeon_program_register_sequence(rdev, 1022 1.1 riastrad evergreen_golden_registers, 1023 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers)); 1024 1.1 riastrad radeon_program_register_sequence(rdev, 1025 1.1 riastrad evergreen_golden_registers2, 1026 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers2)); 1027 1.1 riastrad radeon_program_register_sequence(rdev, 1028 1.1 riastrad juniper_mgcg_init, 1029 1.1 riastrad (const u32)ARRAY_SIZE(juniper_mgcg_init)); 1030 1.1 riastrad break; 1031 1.1 riastrad case CHIP_REDWOOD: 1032 1.1 riastrad radeon_program_register_sequence(rdev, 1033 1.1 riastrad evergreen_golden_registers, 1034 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers)); 1035 1.1 riastrad radeon_program_register_sequence(rdev, 1036 1.1 riastrad evergreen_golden_registers2, 1037 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers2)); 1038 1.1 riastrad radeon_program_register_sequence(rdev, 1039 1.1 riastrad redwood_mgcg_init, 1040 1.1 riastrad (const u32)ARRAY_SIZE(redwood_mgcg_init)); 1041 1.1 riastrad break; 1042 1.1 riastrad case CHIP_CEDAR: 1043 1.1 riastrad radeon_program_register_sequence(rdev, 1044 1.1 riastrad cedar_golden_registers, 1045 1.1 riastrad (const u32)ARRAY_SIZE(cedar_golden_registers)); 1046 1.1 riastrad radeon_program_register_sequence(rdev, 1047 1.1 riastrad evergreen_golden_registers2, 1048 1.1 riastrad (const u32)ARRAY_SIZE(evergreen_golden_registers2)); 1049 1.1 riastrad radeon_program_register_sequence(rdev, 1050 1.1 riastrad cedar_mgcg_init, 1051 1.1 riastrad (const u32)ARRAY_SIZE(cedar_mgcg_init)); 1052 1.1 riastrad break; 1053 1.1 riastrad case CHIP_PALM: 1054 1.1 riastrad radeon_program_register_sequence(rdev, 1055 1.1 riastrad wrestler_golden_registers, 1056 1.1 riastrad (const u32)ARRAY_SIZE(wrestler_golden_registers)); 1057 1.1 riastrad break; 1058 1.1 riastrad case CHIP_SUMO: 1059 1.1 riastrad radeon_program_register_sequence(rdev, 1060 1.1 riastrad supersumo_golden_registers, 1061 1.1 riastrad (const u32)ARRAY_SIZE(supersumo_golden_registers)); 1062 1.1 riastrad break; 1063 1.1 riastrad case CHIP_SUMO2: 1064 1.1 riastrad radeon_program_register_sequence(rdev, 1065 1.1 riastrad supersumo_golden_registers, 1066 1.1 riastrad (const u32)ARRAY_SIZE(supersumo_golden_registers)); 1067 1.1 riastrad radeon_program_register_sequence(rdev, 1068 1.1 riastrad sumo_golden_registers, 1069 1.1 riastrad (const u32)ARRAY_SIZE(sumo_golden_registers)); 1070 1.1 riastrad break; 1071 1.1 riastrad case CHIP_BARTS: 1072 1.1 riastrad radeon_program_register_sequence(rdev, 1073 1.1 riastrad barts_golden_registers, 1074 1.1 riastrad (const u32)ARRAY_SIZE(barts_golden_registers)); 1075 1.1 riastrad break; 1076 1.1 riastrad case CHIP_TURKS: 1077 1.1 riastrad radeon_program_register_sequence(rdev, 1078 1.1 riastrad turks_golden_registers, 1079 1.1 riastrad (const u32)ARRAY_SIZE(turks_golden_registers)); 1080 1.1 riastrad break; 1081 1.1 riastrad case CHIP_CAICOS: 1082 1.1 riastrad radeon_program_register_sequence(rdev, 1083 1.1 riastrad caicos_golden_registers, 1084 1.1 riastrad (const u32)ARRAY_SIZE(caicos_golden_registers)); 1085 1.1 riastrad break; 1086 1.1 riastrad default: 1087 1.1 riastrad break; 1088 1.1 riastrad } 1089 1.1 riastrad } 1090 1.1 riastrad 1091 1.1 riastrad /** 1092 1.1 riastrad * evergreen_get_allowed_info_register - fetch the register for the info ioctl 1093 1.1 riastrad * 1094 1.1 riastrad * @rdev: radeon_device pointer 1095 1.1 riastrad * @reg: register offset in bytes 1096 1.1 riastrad * @val: register value 1097 1.1 riastrad * 1098 1.1 riastrad * Returns 0 for success or -EINVAL for an invalid register 1099 1.1 riastrad * 1100 1.1 riastrad */ 1101 1.1 riastrad int evergreen_get_allowed_info_register(struct radeon_device *rdev, 1102 1.1 riastrad u32 reg, u32 *val) 1103 1.1 riastrad { 1104 1.1 riastrad switch (reg) { 1105 1.1 riastrad case GRBM_STATUS: 1106 1.1 riastrad case GRBM_STATUS_SE0: 1107 1.1 riastrad case GRBM_STATUS_SE1: 1108 1.1 riastrad case SRBM_STATUS: 1109 1.1 riastrad case SRBM_STATUS2: 1110 1.1 riastrad case DMA_STATUS_REG: 1111 1.1 riastrad case UVD_STATUS: 1112 1.1 riastrad *val = RREG32(reg); 1113 1.1 riastrad return 0; 1114 1.1 riastrad default: 1115 1.1 riastrad return -EINVAL; 1116 1.1 riastrad } 1117 1.1 riastrad } 1118 1.1 riastrad 1119 1.1 riastrad void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw, 1120 1.1 riastrad unsigned *bankh, unsigned *mtaspect, 1121 1.1 riastrad unsigned *tile_split) 1122 1.1 riastrad { 1123 1.1 riastrad *bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK; 1124 1.1 riastrad *bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK; 1125 1.1 riastrad *mtaspect = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK; 1126 1.1 riastrad *tile_split = (tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK; 1127 1.1 riastrad switch (*bankw) { 1128 1.1 riastrad default: 1129 1.1 riastrad case 1: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_1; break; 1130 1.1 riastrad case 2: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_2; break; 1131 1.1 riastrad case 4: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_4; break; 1132 1.1 riastrad case 8: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_8; break; 1133 1.1 riastrad } 1134 1.1 riastrad switch (*bankh) { 1135 1.1 riastrad default: 1136 1.1 riastrad case 1: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_1; break; 1137 1.1 riastrad case 2: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_2; break; 1138 1.1 riastrad case 4: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_4; break; 1139 1.1 riastrad case 8: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_8; break; 1140 1.1 riastrad } 1141 1.1 riastrad switch (*mtaspect) { 1142 1.1 riastrad default: 1143 1.1 riastrad case 1: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1; break; 1144 1.1 riastrad case 2: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2; break; 1145 1.1 riastrad case 4: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4; break; 1146 1.1 riastrad case 8: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_8; break; 1147 1.1 riastrad } 1148 1.1 riastrad } 1149 1.1 riastrad 1150 1.1 riastrad static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock, 1151 1.1 riastrad u32 cntl_reg, u32 status_reg) 1152 1.1 riastrad { 1153 1.1 riastrad int r, i; 1154 1.1 riastrad struct atom_clock_dividers dividers; 1155 1.1 riastrad 1156 1.5 riastrad r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 1157 1.1 riastrad clock, false, ÷rs); 1158 1.1 riastrad if (r) 1159 1.1 riastrad return r; 1160 1.1 riastrad 1161 1.1 riastrad WREG32_P(cntl_reg, dividers.post_div, ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK)); 1162 1.1 riastrad 1163 1.1 riastrad for (i = 0; i < 100; i++) { 1164 1.1 riastrad if (RREG32(status_reg) & DCLK_STATUS) 1165 1.1 riastrad break; 1166 1.1 riastrad mdelay(10); 1167 1.1 riastrad } 1168 1.1 riastrad if (i == 100) 1169 1.1 riastrad return -ETIMEDOUT; 1170 1.1 riastrad 1171 1.1 riastrad return 0; 1172 1.1 riastrad } 1173 1.1 riastrad 1174 1.1 riastrad int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) 1175 1.1 riastrad { 1176 1.1 riastrad int r = 0; 1177 1.1 riastrad u32 cg_scratch = RREG32(CG_SCRATCH1); 1178 1.1 riastrad 1179 1.1 riastrad r = sumo_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS); 1180 1.1 riastrad if (r) 1181 1.1 riastrad goto done; 1182 1.1 riastrad cg_scratch &= 0xffff0000; 1183 1.1 riastrad cg_scratch |= vclk / 100; /* Mhz */ 1184 1.1 riastrad 1185 1.1 riastrad r = sumo_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS); 1186 1.1 riastrad if (r) 1187 1.1 riastrad goto done; 1188 1.1 riastrad cg_scratch &= 0x0000ffff; 1189 1.1 riastrad cg_scratch |= (dclk / 100) << 16; /* Mhz */ 1190 1.1 riastrad 1191 1.1 riastrad done: 1192 1.1 riastrad WREG32(CG_SCRATCH1, cg_scratch); 1193 1.1 riastrad 1194 1.1 riastrad return r; 1195 1.1 riastrad } 1196 1.1 riastrad 1197 1.1 riastrad int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) 1198 1.1 riastrad { 1199 1.1 riastrad /* start off with something large */ 1200 1.1 riastrad unsigned fb_div = 0, vclk_div = 0, dclk_div = 0; 1201 1.1 riastrad int r; 1202 1.1 riastrad 1203 1.1 riastrad /* bypass vclk and dclk with bclk */ 1204 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 1205 1.1 riastrad VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1), 1206 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 1207 1.1 riastrad 1208 1.1 riastrad /* put PLL in bypass mode */ 1209 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); 1210 1.1 riastrad 1211 1.1 riastrad if (!vclk || !dclk) { 1212 1.1 riastrad /* keep the Bypass mode, put PLL to sleep */ 1213 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); 1214 1.1 riastrad return 0; 1215 1.1 riastrad } 1216 1.1 riastrad 1217 1.1 riastrad r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000, 1218 1.1 riastrad 16384, 0x03FFFFFF, 0, 128, 5, 1219 1.1 riastrad &fb_div, &vclk_div, &dclk_div); 1220 1.1 riastrad if (r) 1221 1.1 riastrad return r; 1222 1.1 riastrad 1223 1.1 riastrad /* set VCO_MODE to 1 */ 1224 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); 1225 1.1 riastrad 1226 1.1 riastrad /* toggle UPLL_SLEEP to 1 then back to 0 */ 1227 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); 1228 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); 1229 1.1 riastrad 1230 1.1 riastrad /* deassert UPLL_RESET */ 1231 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK); 1232 1.1 riastrad 1233 1.1 riastrad mdelay(1); 1234 1.1 riastrad 1235 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 1236 1.1 riastrad if (r) 1237 1.1 riastrad return r; 1238 1.1 riastrad 1239 1.1 riastrad /* assert UPLL_RESET again */ 1240 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK); 1241 1.1 riastrad 1242 1.1 riastrad /* disable spread spectrum. */ 1243 1.1 riastrad WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK); 1244 1.1 riastrad 1245 1.1 riastrad /* set feedback divider */ 1246 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK); 1247 1.1 riastrad 1248 1.1 riastrad /* set ref divider to 0 */ 1249 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK); 1250 1.1 riastrad 1251 1.1 riastrad if (fb_div < 307200) 1252 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9); 1253 1.1 riastrad else 1254 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9); 1255 1.1 riastrad 1256 1.1 riastrad /* set PDIV_A and PDIV_B */ 1257 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 1258 1.1 riastrad UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div), 1259 1.1 riastrad ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK)); 1260 1.1 riastrad 1261 1.1 riastrad /* give the PLL some time to settle */ 1262 1.1 riastrad mdelay(15); 1263 1.1 riastrad 1264 1.1 riastrad /* deassert PLL_RESET */ 1265 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK); 1266 1.1 riastrad 1267 1.1 riastrad mdelay(15); 1268 1.1 riastrad 1269 1.1 riastrad /* switch from bypass mode to normal mode */ 1270 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK); 1271 1.1 riastrad 1272 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 1273 1.1 riastrad if (r) 1274 1.1 riastrad return r; 1275 1.1 riastrad 1276 1.1 riastrad /* switch VCLK and DCLK selection */ 1277 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 1278 1.1 riastrad VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2), 1279 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 1280 1.1 riastrad 1281 1.1 riastrad mdelay(100); 1282 1.1 riastrad 1283 1.1 riastrad return 0; 1284 1.1 riastrad } 1285 1.1 riastrad 1286 1.1 riastrad void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) 1287 1.1 riastrad { 1288 1.1 riastrad int readrq; 1289 1.1 riastrad u16 v; 1290 1.1 riastrad 1291 1.1 riastrad readrq = pcie_get_readrq(rdev->pdev); 1292 1.1 riastrad v = ffs(readrq) - 8; 1293 1.1 riastrad /* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it 1294 1.1 riastrad * to avoid hangs or perfomance issues 1295 1.1 riastrad */ 1296 1.1 riastrad if ((v == 0) || (v == 6) || (v == 7)) 1297 1.1 riastrad pcie_set_readrq(rdev->pdev, 512); 1298 1.1 riastrad } 1299 1.1 riastrad 1300 1.1 riastrad void dce4_program_fmt(struct drm_encoder *encoder) 1301 1.1 riastrad { 1302 1.1 riastrad struct drm_device *dev = encoder->dev; 1303 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1304 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1305 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1306 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 1307 1.1 riastrad int bpc = 0; 1308 1.1 riastrad u32 tmp = 0; 1309 1.1 riastrad enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE; 1310 1.1 riastrad 1311 1.1 riastrad if (connector) { 1312 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1313 1.1 riastrad bpc = radeon_get_monitor_bpc(connector); 1314 1.1 riastrad dither = radeon_connector->dither; 1315 1.1 riastrad } 1316 1.1 riastrad 1317 1.1 riastrad /* LVDS/eDP FMT is set up by atom */ 1318 1.1 riastrad if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT) 1319 1.1 riastrad return; 1320 1.1 riastrad 1321 1.1 riastrad /* not needed for analog */ 1322 1.1 riastrad if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) || 1323 1.1 riastrad (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2)) 1324 1.1 riastrad return; 1325 1.1 riastrad 1326 1.1 riastrad if (bpc == 0) 1327 1.1 riastrad return; 1328 1.1 riastrad 1329 1.1 riastrad switch (bpc) { 1330 1.1 riastrad case 6: 1331 1.1 riastrad if (dither == RADEON_FMT_DITHER_ENABLE) 1332 1.1 riastrad /* XXX sort out optimal dither settings */ 1333 1.1 riastrad tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE | 1334 1.1 riastrad FMT_SPATIAL_DITHER_EN); 1335 1.1 riastrad else 1336 1.1 riastrad tmp |= FMT_TRUNCATE_EN; 1337 1.1 riastrad break; 1338 1.1 riastrad case 8: 1339 1.1 riastrad if (dither == RADEON_FMT_DITHER_ENABLE) 1340 1.1 riastrad /* XXX sort out optimal dither settings */ 1341 1.1 riastrad tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE | 1342 1.1 riastrad FMT_RGB_RANDOM_ENABLE | 1343 1.1 riastrad FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH); 1344 1.1 riastrad else 1345 1.1 riastrad tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH); 1346 1.1 riastrad break; 1347 1.1 riastrad case 10: 1348 1.1 riastrad default: 1349 1.1 riastrad /* not needed */ 1350 1.1 riastrad break; 1351 1.1 riastrad } 1352 1.1 riastrad 1353 1.1 riastrad WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp); 1354 1.1 riastrad } 1355 1.1 riastrad 1356 1.1 riastrad static bool dce4_is_in_vblank(struct radeon_device *rdev, int crtc) 1357 1.1 riastrad { 1358 1.1 riastrad if (RREG32(EVERGREEN_CRTC_STATUS + crtc_offsets[crtc]) & EVERGREEN_CRTC_V_BLANK) 1359 1.1 riastrad return true; 1360 1.1 riastrad else 1361 1.1 riastrad return false; 1362 1.1 riastrad } 1363 1.1 riastrad 1364 1.1 riastrad static bool dce4_is_counter_moving(struct radeon_device *rdev, int crtc) 1365 1.1 riastrad { 1366 1.1 riastrad u32 pos1, pos2; 1367 1.1 riastrad 1368 1.1 riastrad pos1 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]); 1369 1.1 riastrad pos2 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]); 1370 1.1 riastrad 1371 1.1 riastrad if (pos1 != pos2) 1372 1.1 riastrad return true; 1373 1.1 riastrad else 1374 1.1 riastrad return false; 1375 1.1 riastrad } 1376 1.1 riastrad 1377 1.1 riastrad /** 1378 1.1 riastrad * dce4_wait_for_vblank - vblank wait asic callback. 1379 1.1 riastrad * 1380 1.1 riastrad * @rdev: radeon_device pointer 1381 1.1 riastrad * @crtc: crtc to wait for vblank on 1382 1.1 riastrad * 1383 1.1 riastrad * Wait for vblank on the requested crtc (evergreen+). 1384 1.1 riastrad */ 1385 1.1 riastrad void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc) 1386 1.1 riastrad { 1387 1.1 riastrad unsigned i = 0; 1388 1.1 riastrad 1389 1.1 riastrad if (crtc >= rdev->num_crtc) 1390 1.1 riastrad return; 1391 1.1 riastrad 1392 1.1 riastrad if (!(RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[crtc]) & EVERGREEN_CRTC_MASTER_EN)) 1393 1.1 riastrad return; 1394 1.1 riastrad 1395 1.1 riastrad /* depending on when we hit vblank, we may be close to active; if so, 1396 1.1 riastrad * wait for another frame. 1397 1.1 riastrad */ 1398 1.1 riastrad while (dce4_is_in_vblank(rdev, crtc)) { 1399 1.1 riastrad if (i++ % 100 == 0) { 1400 1.1 riastrad if (!dce4_is_counter_moving(rdev, crtc)) 1401 1.1 riastrad break; 1402 1.1 riastrad } 1403 1.1 riastrad } 1404 1.1 riastrad 1405 1.1 riastrad while (!dce4_is_in_vblank(rdev, crtc)) { 1406 1.1 riastrad if (i++ % 100 == 0) { 1407 1.1 riastrad if (!dce4_is_counter_moving(rdev, crtc)) 1408 1.1 riastrad break; 1409 1.1 riastrad } 1410 1.1 riastrad } 1411 1.1 riastrad } 1412 1.1 riastrad 1413 1.1 riastrad /** 1414 1.1 riastrad * evergreen_page_flip - pageflip callback. 1415 1.1 riastrad * 1416 1.1 riastrad * @rdev: radeon_device pointer 1417 1.1 riastrad * @crtc_id: crtc to cleanup pageflip on 1418 1.1 riastrad * @crtc_base: new address of the crtc (GPU MC address) 1419 1.1 riastrad * 1420 1.1 riastrad * Triggers the actual pageflip by updating the primary 1421 1.1 riastrad * surface base address (evergreen+). 1422 1.1 riastrad */ 1423 1.5 riastrad void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, 1424 1.5 riastrad bool async) 1425 1.1 riastrad { 1426 1.1 riastrad struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 1427 1.1 riastrad 1428 1.1 riastrad /* update the scanout addresses */ 1429 1.5 riastrad WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 1430 1.5 riastrad async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0); 1431 1.1 riastrad WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, 1432 1.1 riastrad upper_32_bits(crtc_base)); 1433 1.1 riastrad WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 1434 1.1 riastrad (u32)crtc_base); 1435 1.1 riastrad /* post the write */ 1436 1.1 riastrad RREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset); 1437 1.1 riastrad } 1438 1.1 riastrad 1439 1.1 riastrad /** 1440 1.1 riastrad * evergreen_page_flip_pending - check if page flip is still pending 1441 1.1 riastrad * 1442 1.1 riastrad * @rdev: radeon_device pointer 1443 1.1 riastrad * @crtc_id: crtc to check 1444 1.1 riastrad * 1445 1.1 riastrad * Returns the current update pending status. 1446 1.1 riastrad */ 1447 1.1 riastrad bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id) 1448 1.1 riastrad { 1449 1.1 riastrad struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 1450 1.1 riastrad 1451 1.1 riastrad /* Return current update_pending status: */ 1452 1.1 riastrad return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & 1453 1.1 riastrad EVERGREEN_GRPH_SURFACE_UPDATE_PENDING); 1454 1.1 riastrad } 1455 1.1 riastrad 1456 1.1 riastrad /* get temperature in millidegrees */ 1457 1.1 riastrad int evergreen_get_temp(struct radeon_device *rdev) 1458 1.1 riastrad { 1459 1.1 riastrad u32 temp, toffset; 1460 1.1 riastrad int actual_temp = 0; 1461 1.1 riastrad 1462 1.1 riastrad if (rdev->family == CHIP_JUNIPER) { 1463 1.1 riastrad toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >> 1464 1.1 riastrad TOFFSET_SHIFT; 1465 1.1 riastrad temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >> 1466 1.1 riastrad TS0_ADC_DOUT_SHIFT; 1467 1.1 riastrad 1468 1.1 riastrad if (toffset & 0x100) 1469 1.1 riastrad actual_temp = temp / 2 - (0x200 - toffset); 1470 1.1 riastrad else 1471 1.1 riastrad actual_temp = temp / 2 + toffset; 1472 1.1 riastrad 1473 1.1 riastrad actual_temp = actual_temp * 1000; 1474 1.1 riastrad 1475 1.1 riastrad } else { 1476 1.1 riastrad temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> 1477 1.1 riastrad ASIC_T_SHIFT; 1478 1.1 riastrad 1479 1.1 riastrad if (temp & 0x400) 1480 1.1 riastrad actual_temp = -256; 1481 1.1 riastrad else if (temp & 0x200) 1482 1.1 riastrad actual_temp = 255; 1483 1.1 riastrad else if (temp & 0x100) { 1484 1.1 riastrad actual_temp = temp & 0x1ff; 1485 1.1 riastrad actual_temp |= ~0x1ff; 1486 1.1 riastrad } else 1487 1.1 riastrad actual_temp = temp & 0xff; 1488 1.1 riastrad 1489 1.1 riastrad actual_temp = (actual_temp * 1000) / 2; 1490 1.1 riastrad } 1491 1.1 riastrad 1492 1.1 riastrad return actual_temp; 1493 1.1 riastrad } 1494 1.1 riastrad 1495 1.1 riastrad int sumo_get_temp(struct radeon_device *rdev) 1496 1.1 riastrad { 1497 1.1 riastrad u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff; 1498 1.1 riastrad int actual_temp = temp - 49; 1499 1.1 riastrad 1500 1.1 riastrad return actual_temp * 1000; 1501 1.1 riastrad } 1502 1.1 riastrad 1503 1.1 riastrad /** 1504 1.1 riastrad * sumo_pm_init_profile - Initialize power profiles callback. 1505 1.1 riastrad * 1506 1.1 riastrad * @rdev: radeon_device pointer 1507 1.1 riastrad * 1508 1.1 riastrad * Initialize the power states used in profile mode 1509 1.1 riastrad * (sumo, trinity, SI). 1510 1.1 riastrad * Used for profile mode only. 1511 1.1 riastrad */ 1512 1.1 riastrad void sumo_pm_init_profile(struct radeon_device *rdev) 1513 1.1 riastrad { 1514 1.1 riastrad int idx; 1515 1.1 riastrad 1516 1.1 riastrad /* default */ 1517 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 1518 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 1519 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 1520 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 1521 1.1 riastrad 1522 1.1 riastrad /* low,mid sh/mh */ 1523 1.1 riastrad if (rdev->flags & RADEON_IS_MOBILITY) 1524 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0); 1525 1.1 riastrad else 1526 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0); 1527 1.1 riastrad 1528 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx; 1529 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx; 1530 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 1531 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 1532 1.1 riastrad 1533 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx; 1534 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx; 1535 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 1536 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 1537 1.1 riastrad 1538 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx; 1539 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx; 1540 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 1541 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0; 1542 1.1 riastrad 1543 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx; 1544 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx; 1545 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 1546 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 1547 1.1 riastrad 1548 1.1 riastrad /* high sh/mh */ 1549 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0); 1550 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx; 1551 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx; 1552 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 1553 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 1554 1.1 riastrad rdev->pm.power_state[idx].num_clock_modes - 1; 1555 1.1 riastrad 1556 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx; 1557 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx; 1558 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 1559 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 1560 1.1 riastrad rdev->pm.power_state[idx].num_clock_modes - 1; 1561 1.1 riastrad } 1562 1.1 riastrad 1563 1.1 riastrad /** 1564 1.1 riastrad * btc_pm_init_profile - Initialize power profiles callback. 1565 1.1 riastrad * 1566 1.1 riastrad * @rdev: radeon_device pointer 1567 1.1 riastrad * 1568 1.1 riastrad * Initialize the power states used in profile mode 1569 1.1 riastrad * (BTC, cayman). 1570 1.1 riastrad * Used for profile mode only. 1571 1.1 riastrad */ 1572 1.1 riastrad void btc_pm_init_profile(struct radeon_device *rdev) 1573 1.1 riastrad { 1574 1.1 riastrad int idx; 1575 1.1 riastrad 1576 1.1 riastrad /* default */ 1577 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 1578 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 1579 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 1580 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2; 1581 1.1 riastrad /* starting with BTC, there is one state that is used for both 1582 1.1 riastrad * MH and SH. Difference is that we always use the high clock index for 1583 1.1 riastrad * mclk. 1584 1.1 riastrad */ 1585 1.1 riastrad if (rdev->flags & RADEON_IS_MOBILITY) 1586 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0); 1587 1.1 riastrad else 1588 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0); 1589 1.1 riastrad /* low sh */ 1590 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx; 1591 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx; 1592 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 1593 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 1594 1.1 riastrad /* mid sh */ 1595 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx; 1596 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx; 1597 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 1598 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1; 1599 1.1 riastrad /* high sh */ 1600 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx; 1601 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx; 1602 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 1603 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2; 1604 1.1 riastrad /* low mh */ 1605 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx; 1606 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx; 1607 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 1608 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 1609 1.1 riastrad /* mid mh */ 1610 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx; 1611 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx; 1612 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 1613 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1; 1614 1.1 riastrad /* high mh */ 1615 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx; 1616 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx; 1617 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 1618 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2; 1619 1.1 riastrad } 1620 1.1 riastrad 1621 1.1 riastrad /** 1622 1.1 riastrad * evergreen_pm_misc - set additional pm hw parameters callback. 1623 1.1 riastrad * 1624 1.1 riastrad * @rdev: radeon_device pointer 1625 1.1 riastrad * 1626 1.1 riastrad * Set non-clock parameters associated with a power state 1627 1.1 riastrad * (voltage, etc.) (evergreen+). 1628 1.1 riastrad */ 1629 1.1 riastrad void evergreen_pm_misc(struct radeon_device *rdev) 1630 1.1 riastrad { 1631 1.1 riastrad int req_ps_idx = rdev->pm.requested_power_state_index; 1632 1.1 riastrad int req_cm_idx = rdev->pm.requested_clock_mode_index; 1633 1.1 riastrad struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; 1634 1.1 riastrad struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 1635 1.1 riastrad 1636 1.1 riastrad if (voltage->type == VOLTAGE_SW) { 1637 1.1 riastrad /* 0xff0x are flags rather then an actual voltage */ 1638 1.1 riastrad if ((voltage->voltage & 0xff00) == 0xff00) 1639 1.1 riastrad return; 1640 1.1 riastrad if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { 1641 1.1 riastrad radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); 1642 1.1 riastrad rdev->pm.current_vddc = voltage->voltage; 1643 1.1 riastrad DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage); 1644 1.1 riastrad } 1645 1.1 riastrad 1646 1.1 riastrad /* starting with BTC, there is one state that is used for both 1647 1.1 riastrad * MH and SH. Difference is that we always use the high clock index for 1648 1.1 riastrad * mclk and vddci. 1649 1.1 riastrad */ 1650 1.1 riastrad if ((rdev->pm.pm_method == PM_METHOD_PROFILE) && 1651 1.1 riastrad (rdev->family >= CHIP_BARTS) && 1652 1.1 riastrad rdev->pm.active_crtc_count && 1653 1.1 riastrad ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) || 1654 1.1 riastrad (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX))) 1655 1.1 riastrad voltage = &rdev->pm.power_state[req_ps_idx]. 1656 1.1 riastrad clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage; 1657 1.1 riastrad 1658 1.1 riastrad /* 0xff0x are flags rather then an actual voltage */ 1659 1.1 riastrad if ((voltage->vddci & 0xff00) == 0xff00) 1660 1.1 riastrad return; 1661 1.1 riastrad if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { 1662 1.1 riastrad radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); 1663 1.1 riastrad rdev->pm.current_vddci = voltage->vddci; 1664 1.1 riastrad DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci); 1665 1.1 riastrad } 1666 1.1 riastrad } 1667 1.1 riastrad } 1668 1.1 riastrad 1669 1.1 riastrad /** 1670 1.1 riastrad * evergreen_pm_prepare - pre-power state change callback. 1671 1.1 riastrad * 1672 1.1 riastrad * @rdev: radeon_device pointer 1673 1.1 riastrad * 1674 1.1 riastrad * Prepare for a power state change (evergreen+). 1675 1.1 riastrad */ 1676 1.1 riastrad void evergreen_pm_prepare(struct radeon_device *rdev) 1677 1.1 riastrad { 1678 1.1 riastrad struct drm_device *ddev = rdev->ddev; 1679 1.1 riastrad struct drm_crtc *crtc; 1680 1.1 riastrad struct radeon_crtc *radeon_crtc; 1681 1.1 riastrad u32 tmp; 1682 1.1 riastrad 1683 1.1 riastrad /* disable any active CRTCs */ 1684 1.1 riastrad list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { 1685 1.1 riastrad radeon_crtc = to_radeon_crtc(crtc); 1686 1.1 riastrad if (radeon_crtc->enabled) { 1687 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset); 1688 1.1 riastrad tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; 1689 1.1 riastrad WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp); 1690 1.1 riastrad } 1691 1.1 riastrad } 1692 1.1 riastrad } 1693 1.1 riastrad 1694 1.1 riastrad /** 1695 1.1 riastrad * evergreen_pm_finish - post-power state change callback. 1696 1.1 riastrad * 1697 1.1 riastrad * @rdev: radeon_device pointer 1698 1.1 riastrad * 1699 1.1 riastrad * Clean up after a power state change (evergreen+). 1700 1.1 riastrad */ 1701 1.1 riastrad void evergreen_pm_finish(struct radeon_device *rdev) 1702 1.1 riastrad { 1703 1.1 riastrad struct drm_device *ddev = rdev->ddev; 1704 1.1 riastrad struct drm_crtc *crtc; 1705 1.1 riastrad struct radeon_crtc *radeon_crtc; 1706 1.1 riastrad u32 tmp; 1707 1.1 riastrad 1708 1.1 riastrad /* enable any active CRTCs */ 1709 1.1 riastrad list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { 1710 1.1 riastrad radeon_crtc = to_radeon_crtc(crtc); 1711 1.1 riastrad if (radeon_crtc->enabled) { 1712 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset); 1713 1.1 riastrad tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; 1714 1.1 riastrad WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp); 1715 1.1 riastrad } 1716 1.1 riastrad } 1717 1.1 riastrad } 1718 1.1 riastrad 1719 1.1 riastrad /** 1720 1.1 riastrad * evergreen_hpd_sense - hpd sense callback. 1721 1.1 riastrad * 1722 1.1 riastrad * @rdev: radeon_device pointer 1723 1.1 riastrad * @hpd: hpd (hotplug detect) pin 1724 1.1 riastrad * 1725 1.1 riastrad * Checks if a digital monitor is connected (evergreen+). 1726 1.1 riastrad * Returns true if connected, false if not connected. 1727 1.1 riastrad */ 1728 1.1 riastrad bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) 1729 1.1 riastrad { 1730 1.5 riastrad if (hpd == RADEON_HPD_NONE) 1731 1.5 riastrad return false; 1732 1.1 riastrad 1733 1.5 riastrad return !!(RREG32(DC_HPDx_INT_STATUS_REG(hpd)) & DC_HPDx_SENSE); 1734 1.1 riastrad } 1735 1.1 riastrad 1736 1.1 riastrad /** 1737 1.1 riastrad * evergreen_hpd_set_polarity - hpd set polarity callback. 1738 1.1 riastrad * 1739 1.1 riastrad * @rdev: radeon_device pointer 1740 1.1 riastrad * @hpd: hpd (hotplug detect) pin 1741 1.1 riastrad * 1742 1.1 riastrad * Set the polarity of the hpd pin (evergreen+). 1743 1.1 riastrad */ 1744 1.1 riastrad void evergreen_hpd_set_polarity(struct radeon_device *rdev, 1745 1.1 riastrad enum radeon_hpd_id hpd) 1746 1.1 riastrad { 1747 1.1 riastrad bool connected = evergreen_hpd_sense(rdev, hpd); 1748 1.1 riastrad 1749 1.5 riastrad if (hpd == RADEON_HPD_NONE) 1750 1.5 riastrad return; 1751 1.5 riastrad 1752 1.5 riastrad if (connected) 1753 1.5 riastrad WREG32_AND(DC_HPDx_INT_CONTROL(hpd), ~DC_HPDx_INT_POLARITY); 1754 1.5 riastrad else 1755 1.5 riastrad WREG32_OR(DC_HPDx_INT_CONTROL(hpd), DC_HPDx_INT_POLARITY); 1756 1.1 riastrad } 1757 1.1 riastrad 1758 1.1 riastrad /** 1759 1.1 riastrad * evergreen_hpd_init - hpd setup callback. 1760 1.1 riastrad * 1761 1.1 riastrad * @rdev: radeon_device pointer 1762 1.1 riastrad * 1763 1.1 riastrad * Setup the hpd pins used by the card (evergreen+). 1764 1.1 riastrad * Enable the pin, set the polarity, and enable the hpd interrupts. 1765 1.1 riastrad */ 1766 1.1 riastrad void evergreen_hpd_init(struct radeon_device *rdev) 1767 1.1 riastrad { 1768 1.1 riastrad struct drm_device *dev = rdev->ddev; 1769 1.1 riastrad struct drm_connector *connector; 1770 1.1 riastrad unsigned enabled = 0; 1771 1.1 riastrad u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | 1772 1.1 riastrad DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN; 1773 1.1 riastrad 1774 1.1 riastrad list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1775 1.5 riastrad enum radeon_hpd_id hpd = 1776 1.5 riastrad to_radeon_connector(connector)->hpd.hpd; 1777 1.1 riastrad 1778 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 1779 1.1 riastrad connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { 1780 1.1 riastrad /* don't try to enable hpd on eDP or LVDS avoid breaking the 1781 1.1 riastrad * aux dp channel on imac and help (but not completely fix) 1782 1.1 riastrad * https://bugzilla.redhat.com/show_bug.cgi?id=726143 1783 1.1 riastrad * also avoid interrupt storms during dpms. 1784 1.1 riastrad */ 1785 1.1 riastrad continue; 1786 1.1 riastrad } 1787 1.5 riastrad 1788 1.5 riastrad if (hpd == RADEON_HPD_NONE) 1789 1.5 riastrad continue; 1790 1.5 riastrad 1791 1.5 riastrad WREG32(DC_HPDx_CONTROL(hpd), tmp); 1792 1.5 riastrad enabled |= 1 << hpd; 1793 1.5 riastrad 1794 1.5 riastrad radeon_hpd_set_polarity(rdev, hpd); 1795 1.1 riastrad } 1796 1.1 riastrad radeon_irq_kms_enable_hpd(rdev, enabled); 1797 1.1 riastrad } 1798 1.1 riastrad 1799 1.1 riastrad /** 1800 1.1 riastrad * evergreen_hpd_fini - hpd tear down callback. 1801 1.1 riastrad * 1802 1.1 riastrad * @rdev: radeon_device pointer 1803 1.1 riastrad * 1804 1.1 riastrad * Tear down the hpd pins used by the card (evergreen+). 1805 1.1 riastrad * Disable the hpd interrupts. 1806 1.1 riastrad */ 1807 1.1 riastrad void evergreen_hpd_fini(struct radeon_device *rdev) 1808 1.1 riastrad { 1809 1.1 riastrad struct drm_device *dev = rdev->ddev; 1810 1.1 riastrad struct drm_connector *connector; 1811 1.1 riastrad unsigned disabled = 0; 1812 1.1 riastrad 1813 1.1 riastrad list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1814 1.5 riastrad enum radeon_hpd_id hpd = 1815 1.5 riastrad to_radeon_connector(connector)->hpd.hpd; 1816 1.5 riastrad 1817 1.5 riastrad if (hpd == RADEON_HPD_NONE) 1818 1.5 riastrad continue; 1819 1.5 riastrad 1820 1.5 riastrad WREG32(DC_HPDx_CONTROL(hpd), 0); 1821 1.5 riastrad disabled |= 1 << hpd; 1822 1.1 riastrad } 1823 1.1 riastrad radeon_irq_kms_disable_hpd(rdev, disabled); 1824 1.1 riastrad } 1825 1.1 riastrad 1826 1.1 riastrad /* watermark setup */ 1827 1.1 riastrad 1828 1.1 riastrad static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, 1829 1.1 riastrad struct radeon_crtc *radeon_crtc, 1830 1.1 riastrad struct drm_display_mode *mode, 1831 1.1 riastrad struct drm_display_mode *other_mode) 1832 1.1 riastrad { 1833 1.1 riastrad u32 tmp, buffer_alloc, i; 1834 1.1 riastrad u32 pipe_offset = radeon_crtc->crtc_id * 0x20; 1835 1.1 riastrad /* 1836 1.1 riastrad * Line Buffer Setup 1837 1.1 riastrad * There are 3 line buffers, each one shared by 2 display controllers. 1838 1.1 riastrad * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between 1839 1.1 riastrad * the display controllers. The paritioning is done via one of four 1840 1.1 riastrad * preset allocations specified in bits 2:0: 1841 1.1 riastrad * first display controller 1842 1.1 riastrad * 0 - first half of lb (3840 * 2) 1843 1.1 riastrad * 1 - first 3/4 of lb (5760 * 2) 1844 1.1 riastrad * 2 - whole lb (7680 * 2), other crtc must be disabled 1845 1.1 riastrad * 3 - first 1/4 of lb (1920 * 2) 1846 1.1 riastrad * second display controller 1847 1.1 riastrad * 4 - second half of lb (3840 * 2) 1848 1.1 riastrad * 5 - second 3/4 of lb (5760 * 2) 1849 1.1 riastrad * 6 - whole lb (7680 * 2), other crtc must be disabled 1850 1.1 riastrad * 7 - last 1/4 of lb (1920 * 2) 1851 1.1 riastrad */ 1852 1.1 riastrad /* this can get tricky if we have two large displays on a paired group 1853 1.1 riastrad * of crtcs. Ideally for multiple large displays we'd assign them to 1854 1.1 riastrad * non-linked crtcs for maximum line buffer allocation. 1855 1.1 riastrad */ 1856 1.1 riastrad if (radeon_crtc->base.enabled && mode) { 1857 1.1 riastrad if (other_mode) { 1858 1.1 riastrad tmp = 0; /* 1/2 */ 1859 1.1 riastrad buffer_alloc = 1; 1860 1.1 riastrad } else { 1861 1.1 riastrad tmp = 2; /* whole */ 1862 1.1 riastrad buffer_alloc = 2; 1863 1.1 riastrad } 1864 1.1 riastrad } else { 1865 1.1 riastrad tmp = 0; 1866 1.1 riastrad buffer_alloc = 0; 1867 1.1 riastrad } 1868 1.1 riastrad 1869 1.1 riastrad /* second controller of the pair uses second half of the lb */ 1870 1.1 riastrad if (radeon_crtc->crtc_id % 2) 1871 1.1 riastrad tmp += 4; 1872 1.1 riastrad WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); 1873 1.1 riastrad 1874 1.1 riastrad if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { 1875 1.1 riastrad WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset, 1876 1.1 riastrad DMIF_BUFFERS_ALLOCATED(buffer_alloc)); 1877 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 1878 1.1 riastrad if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) & 1879 1.1 riastrad DMIF_BUFFERS_ALLOCATED_COMPLETED) 1880 1.1 riastrad break; 1881 1.1 riastrad udelay(1); 1882 1.1 riastrad } 1883 1.1 riastrad } 1884 1.1 riastrad 1885 1.1 riastrad if (radeon_crtc->base.enabled && mode) { 1886 1.1 riastrad switch (tmp) { 1887 1.1 riastrad case 0: 1888 1.1 riastrad case 4: 1889 1.1 riastrad default: 1890 1.1 riastrad if (ASIC_IS_DCE5(rdev)) 1891 1.1 riastrad return 4096 * 2; 1892 1.1 riastrad else 1893 1.1 riastrad return 3840 * 2; 1894 1.1 riastrad case 1: 1895 1.1 riastrad case 5: 1896 1.1 riastrad if (ASIC_IS_DCE5(rdev)) 1897 1.1 riastrad return 6144 * 2; 1898 1.1 riastrad else 1899 1.1 riastrad return 5760 * 2; 1900 1.1 riastrad case 2: 1901 1.1 riastrad case 6: 1902 1.1 riastrad if (ASIC_IS_DCE5(rdev)) 1903 1.1 riastrad return 8192 * 2; 1904 1.1 riastrad else 1905 1.1 riastrad return 7680 * 2; 1906 1.1 riastrad case 3: 1907 1.1 riastrad case 7: 1908 1.1 riastrad if (ASIC_IS_DCE5(rdev)) 1909 1.1 riastrad return 2048 * 2; 1910 1.1 riastrad else 1911 1.1 riastrad return 1920 * 2; 1912 1.1 riastrad } 1913 1.1 riastrad } 1914 1.1 riastrad 1915 1.1 riastrad /* controller not enabled, so no lb used */ 1916 1.1 riastrad return 0; 1917 1.1 riastrad } 1918 1.1 riastrad 1919 1.1 riastrad u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) 1920 1.1 riastrad { 1921 1.1 riastrad u32 tmp = RREG32(MC_SHARED_CHMAP); 1922 1.1 riastrad 1923 1.1 riastrad switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { 1924 1.1 riastrad case 0: 1925 1.1 riastrad default: 1926 1.1 riastrad return 1; 1927 1.1 riastrad case 1: 1928 1.1 riastrad return 2; 1929 1.1 riastrad case 2: 1930 1.1 riastrad return 4; 1931 1.1 riastrad case 3: 1932 1.1 riastrad return 8; 1933 1.1 riastrad } 1934 1.1 riastrad } 1935 1.1 riastrad 1936 1.1 riastrad struct evergreen_wm_params { 1937 1.1 riastrad u32 dram_channels; /* number of dram channels */ 1938 1.1 riastrad u32 yclk; /* bandwidth per dram data pin in kHz */ 1939 1.1 riastrad u32 sclk; /* engine clock in kHz */ 1940 1.1 riastrad u32 disp_clk; /* display clock in kHz */ 1941 1.1 riastrad u32 src_width; /* viewport width */ 1942 1.1 riastrad u32 active_time; /* active display time in ns */ 1943 1.1 riastrad u32 blank_time; /* blank time in ns */ 1944 1.1 riastrad bool interlaced; /* mode is interlaced */ 1945 1.1 riastrad fixed20_12 vsc; /* vertical scale ratio */ 1946 1.1 riastrad u32 num_heads; /* number of active crtcs */ 1947 1.1 riastrad u32 bytes_per_pixel; /* bytes per pixel display + overlay */ 1948 1.1 riastrad u32 lb_size; /* line buffer allocated to pipe */ 1949 1.1 riastrad u32 vtaps; /* vertical scaler taps */ 1950 1.1 riastrad }; 1951 1.1 riastrad 1952 1.1 riastrad static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm) 1953 1.1 riastrad { 1954 1.1 riastrad /* Calculate DRAM Bandwidth and the part allocated to display. */ 1955 1.1 riastrad fixed20_12 dram_efficiency; /* 0.7 */ 1956 1.1 riastrad fixed20_12 yclk, dram_channels, bandwidth; 1957 1.1 riastrad fixed20_12 a; 1958 1.1 riastrad 1959 1.1 riastrad a.full = dfixed_const(1000); 1960 1.1 riastrad yclk.full = dfixed_const(wm->yclk); 1961 1.1 riastrad yclk.full = dfixed_div(yclk, a); 1962 1.1 riastrad dram_channels.full = dfixed_const(wm->dram_channels * 4); 1963 1.1 riastrad a.full = dfixed_const(10); 1964 1.1 riastrad dram_efficiency.full = dfixed_const(7); 1965 1.1 riastrad dram_efficiency.full = dfixed_div(dram_efficiency, a); 1966 1.1 riastrad bandwidth.full = dfixed_mul(dram_channels, yclk); 1967 1.1 riastrad bandwidth.full = dfixed_mul(bandwidth, dram_efficiency); 1968 1.1 riastrad 1969 1.1 riastrad return dfixed_trunc(bandwidth); 1970 1.1 riastrad } 1971 1.1 riastrad 1972 1.1 riastrad static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm) 1973 1.1 riastrad { 1974 1.1 riastrad /* Calculate DRAM Bandwidth and the part allocated to display. */ 1975 1.1 riastrad fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */ 1976 1.1 riastrad fixed20_12 yclk, dram_channels, bandwidth; 1977 1.1 riastrad fixed20_12 a; 1978 1.1 riastrad 1979 1.1 riastrad a.full = dfixed_const(1000); 1980 1.1 riastrad yclk.full = dfixed_const(wm->yclk); 1981 1.1 riastrad yclk.full = dfixed_div(yclk, a); 1982 1.1 riastrad dram_channels.full = dfixed_const(wm->dram_channels * 4); 1983 1.1 riastrad a.full = dfixed_const(10); 1984 1.1 riastrad disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */ 1985 1.1 riastrad disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a); 1986 1.1 riastrad bandwidth.full = dfixed_mul(dram_channels, yclk); 1987 1.1 riastrad bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation); 1988 1.1 riastrad 1989 1.1 riastrad return dfixed_trunc(bandwidth); 1990 1.1 riastrad } 1991 1.1 riastrad 1992 1.1 riastrad static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm) 1993 1.1 riastrad { 1994 1.1 riastrad /* Calculate the display Data return Bandwidth */ 1995 1.1 riastrad fixed20_12 return_efficiency; /* 0.8 */ 1996 1.1 riastrad fixed20_12 sclk, bandwidth; 1997 1.1 riastrad fixed20_12 a; 1998 1.1 riastrad 1999 1.1 riastrad a.full = dfixed_const(1000); 2000 1.1 riastrad sclk.full = dfixed_const(wm->sclk); 2001 1.1 riastrad sclk.full = dfixed_div(sclk, a); 2002 1.1 riastrad a.full = dfixed_const(10); 2003 1.1 riastrad return_efficiency.full = dfixed_const(8); 2004 1.1 riastrad return_efficiency.full = dfixed_div(return_efficiency, a); 2005 1.1 riastrad a.full = dfixed_const(32); 2006 1.1 riastrad bandwidth.full = dfixed_mul(a, sclk); 2007 1.1 riastrad bandwidth.full = dfixed_mul(bandwidth, return_efficiency); 2008 1.1 riastrad 2009 1.1 riastrad return dfixed_trunc(bandwidth); 2010 1.1 riastrad } 2011 1.1 riastrad 2012 1.1 riastrad static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm) 2013 1.1 riastrad { 2014 1.1 riastrad /* Calculate the DMIF Request Bandwidth */ 2015 1.1 riastrad fixed20_12 disp_clk_request_efficiency; /* 0.8 */ 2016 1.1 riastrad fixed20_12 disp_clk, bandwidth; 2017 1.1 riastrad fixed20_12 a; 2018 1.1 riastrad 2019 1.1 riastrad a.full = dfixed_const(1000); 2020 1.1 riastrad disp_clk.full = dfixed_const(wm->disp_clk); 2021 1.1 riastrad disp_clk.full = dfixed_div(disp_clk, a); 2022 1.1 riastrad a.full = dfixed_const(10); 2023 1.1 riastrad disp_clk_request_efficiency.full = dfixed_const(8); 2024 1.1 riastrad disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a); 2025 1.1 riastrad a.full = dfixed_const(32); 2026 1.1 riastrad bandwidth.full = dfixed_mul(a, disp_clk); 2027 1.1 riastrad bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency); 2028 1.1 riastrad 2029 1.1 riastrad return dfixed_trunc(bandwidth); 2030 1.1 riastrad } 2031 1.1 riastrad 2032 1.1 riastrad static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm) 2033 1.1 riastrad { 2034 1.1 riastrad /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */ 2035 1.1 riastrad u32 dram_bandwidth = evergreen_dram_bandwidth(wm); 2036 1.1 riastrad u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm); 2037 1.1 riastrad u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm); 2038 1.1 riastrad 2039 1.1 riastrad return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth)); 2040 1.1 riastrad } 2041 1.1 riastrad 2042 1.1 riastrad static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm) 2043 1.1 riastrad { 2044 1.1 riastrad /* Calculate the display mode Average Bandwidth 2045 1.1 riastrad * DisplayMode should contain the source and destination dimensions, 2046 1.1 riastrad * timing, etc. 2047 1.1 riastrad */ 2048 1.1 riastrad fixed20_12 bpp; 2049 1.1 riastrad fixed20_12 line_time; 2050 1.1 riastrad fixed20_12 src_width; 2051 1.1 riastrad fixed20_12 bandwidth; 2052 1.1 riastrad fixed20_12 a; 2053 1.1 riastrad 2054 1.1 riastrad a.full = dfixed_const(1000); 2055 1.1 riastrad line_time.full = dfixed_const(wm->active_time + wm->blank_time); 2056 1.1 riastrad line_time.full = dfixed_div(line_time, a); 2057 1.1 riastrad bpp.full = dfixed_const(wm->bytes_per_pixel); 2058 1.1 riastrad src_width.full = dfixed_const(wm->src_width); 2059 1.1 riastrad bandwidth.full = dfixed_mul(src_width, bpp); 2060 1.1 riastrad bandwidth.full = dfixed_mul(bandwidth, wm->vsc); 2061 1.1 riastrad bandwidth.full = dfixed_div(bandwidth, line_time); 2062 1.1 riastrad 2063 1.1 riastrad return dfixed_trunc(bandwidth); 2064 1.1 riastrad } 2065 1.1 riastrad 2066 1.1 riastrad static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm) 2067 1.1 riastrad { 2068 1.1 riastrad /* First calcualte the latency in ns */ 2069 1.1 riastrad u32 mc_latency = 2000; /* 2000 ns. */ 2070 1.1 riastrad u32 available_bandwidth = evergreen_available_bandwidth(wm); 2071 1.1 riastrad u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth; 2072 1.1 riastrad u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth; 2073 1.1 riastrad u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */ 2074 1.1 riastrad u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) + 2075 1.1 riastrad (wm->num_heads * cursor_line_pair_return_time); 2076 1.1 riastrad u32 latency = mc_latency + other_heads_data_return_time + dc_latency; 2077 1.1 riastrad u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time; 2078 1.1 riastrad fixed20_12 a, b, c; 2079 1.1 riastrad 2080 1.1 riastrad if (wm->num_heads == 0) 2081 1.1 riastrad return 0; 2082 1.1 riastrad 2083 1.1 riastrad a.full = dfixed_const(2); 2084 1.1 riastrad b.full = dfixed_const(1); 2085 1.1 riastrad if ((wm->vsc.full > a.full) || 2086 1.1 riastrad ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) || 2087 1.1 riastrad (wm->vtaps >= 5) || 2088 1.1 riastrad ((wm->vsc.full >= a.full) && wm->interlaced)) 2089 1.1 riastrad max_src_lines_per_dst_line = 4; 2090 1.1 riastrad else 2091 1.1 riastrad max_src_lines_per_dst_line = 2; 2092 1.1 riastrad 2093 1.1 riastrad a.full = dfixed_const(available_bandwidth); 2094 1.1 riastrad b.full = dfixed_const(wm->num_heads); 2095 1.1 riastrad a.full = dfixed_div(a, b); 2096 1.1 riastrad 2097 1.5 riastrad lb_fill_bw = min(dfixed_trunc(a), wm->disp_clk * wm->bytes_per_pixel / 1000); 2098 1.1 riastrad 2099 1.1 riastrad a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel); 2100 1.1 riastrad b.full = dfixed_const(1000); 2101 1.1 riastrad c.full = dfixed_const(lb_fill_bw); 2102 1.1 riastrad b.full = dfixed_div(c, b); 2103 1.1 riastrad a.full = dfixed_div(a, b); 2104 1.1 riastrad line_fill_time = dfixed_trunc(a); 2105 1.1 riastrad 2106 1.1 riastrad if (line_fill_time < wm->active_time) 2107 1.1 riastrad return latency; 2108 1.1 riastrad else 2109 1.1 riastrad return latency + (line_fill_time - wm->active_time); 2110 1.1 riastrad 2111 1.1 riastrad } 2112 1.1 riastrad 2113 1.1 riastrad static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm) 2114 1.1 riastrad { 2115 1.1 riastrad if (evergreen_average_bandwidth(wm) <= 2116 1.1 riastrad (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads)) 2117 1.1 riastrad return true; 2118 1.1 riastrad else 2119 1.1 riastrad return false; 2120 1.1 riastrad }; 2121 1.1 riastrad 2122 1.1 riastrad static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm) 2123 1.1 riastrad { 2124 1.1 riastrad if (evergreen_average_bandwidth(wm) <= 2125 1.1 riastrad (evergreen_available_bandwidth(wm) / wm->num_heads)) 2126 1.1 riastrad return true; 2127 1.1 riastrad else 2128 1.1 riastrad return false; 2129 1.1 riastrad }; 2130 1.1 riastrad 2131 1.1 riastrad static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm) 2132 1.1 riastrad { 2133 1.1 riastrad u32 lb_partitions = wm->lb_size / wm->src_width; 2134 1.1 riastrad u32 line_time = wm->active_time + wm->blank_time; 2135 1.1 riastrad u32 latency_tolerant_lines; 2136 1.1 riastrad u32 latency_hiding; 2137 1.1 riastrad fixed20_12 a; 2138 1.1 riastrad 2139 1.1 riastrad a.full = dfixed_const(1); 2140 1.1 riastrad if (wm->vsc.full > a.full) 2141 1.1 riastrad latency_tolerant_lines = 1; 2142 1.1 riastrad else { 2143 1.1 riastrad if (lb_partitions <= (wm->vtaps + 1)) 2144 1.1 riastrad latency_tolerant_lines = 1; 2145 1.1 riastrad else 2146 1.1 riastrad latency_tolerant_lines = 2; 2147 1.1 riastrad } 2148 1.1 riastrad 2149 1.1 riastrad latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time); 2150 1.1 riastrad 2151 1.1 riastrad if (evergreen_latency_watermark(wm) <= latency_hiding) 2152 1.1 riastrad return true; 2153 1.1 riastrad else 2154 1.1 riastrad return false; 2155 1.1 riastrad } 2156 1.1 riastrad 2157 1.1 riastrad static void evergreen_program_watermarks(struct radeon_device *rdev, 2158 1.1 riastrad struct radeon_crtc *radeon_crtc, 2159 1.1 riastrad u32 lb_size, u32 num_heads) 2160 1.1 riastrad { 2161 1.1 riastrad struct drm_display_mode *mode = &radeon_crtc->base.mode; 2162 1.1 riastrad struct evergreen_wm_params wm_low, wm_high; 2163 1.1 riastrad u32 dram_channels; 2164 1.5 riastrad u32 active_time; 2165 1.1 riastrad u32 line_time = 0; 2166 1.1 riastrad u32 latency_watermark_a = 0, latency_watermark_b = 0; 2167 1.1 riastrad u32 priority_a_mark = 0, priority_b_mark = 0; 2168 1.1 riastrad u32 priority_a_cnt = PRIORITY_OFF; 2169 1.1 riastrad u32 priority_b_cnt = PRIORITY_OFF; 2170 1.1 riastrad u32 pipe_offset = radeon_crtc->crtc_id * 16; 2171 1.1 riastrad u32 tmp, arb_control3; 2172 1.1 riastrad fixed20_12 a, b, c; 2173 1.1 riastrad 2174 1.1 riastrad if (radeon_crtc->base.enabled && num_heads && mode) { 2175 1.5 riastrad active_time = (u32) div_u64((u64)mode->crtc_hdisplay * 1000000, 2176 1.5 riastrad (u32)mode->clock); 2177 1.5 riastrad line_time = (u32) div_u64((u64)mode->crtc_htotal * 1000000, 2178 1.5 riastrad (u32)mode->clock); 2179 1.5 riastrad line_time = min(line_time, (u32)65535); 2180 1.1 riastrad priority_a_cnt = 0; 2181 1.1 riastrad priority_b_cnt = 0; 2182 1.1 riastrad dram_channels = evergreen_get_number_of_dram_channels(rdev); 2183 1.1 riastrad 2184 1.1 riastrad /* watermark for high clocks */ 2185 1.1 riastrad if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { 2186 1.1 riastrad wm_high.yclk = 2187 1.1 riastrad radeon_dpm_get_mclk(rdev, false) * 10; 2188 1.1 riastrad wm_high.sclk = 2189 1.1 riastrad radeon_dpm_get_sclk(rdev, false) * 10; 2190 1.1 riastrad } else { 2191 1.1 riastrad wm_high.yclk = rdev->pm.current_mclk * 10; 2192 1.1 riastrad wm_high.sclk = rdev->pm.current_sclk * 10; 2193 1.1 riastrad } 2194 1.1 riastrad 2195 1.1 riastrad wm_high.disp_clk = mode->clock; 2196 1.1 riastrad wm_high.src_width = mode->crtc_hdisplay; 2197 1.5 riastrad wm_high.active_time = active_time; 2198 1.1 riastrad wm_high.blank_time = line_time - wm_high.active_time; 2199 1.1 riastrad wm_high.interlaced = false; 2200 1.1 riastrad if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2201 1.1 riastrad wm_high.interlaced = true; 2202 1.1 riastrad wm_high.vsc = radeon_crtc->vsc; 2203 1.1 riastrad wm_high.vtaps = 1; 2204 1.1 riastrad if (radeon_crtc->rmx_type != RMX_OFF) 2205 1.1 riastrad wm_high.vtaps = 2; 2206 1.1 riastrad wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */ 2207 1.1 riastrad wm_high.lb_size = lb_size; 2208 1.1 riastrad wm_high.dram_channels = dram_channels; 2209 1.1 riastrad wm_high.num_heads = num_heads; 2210 1.1 riastrad 2211 1.1 riastrad /* watermark for low clocks */ 2212 1.1 riastrad if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { 2213 1.1 riastrad wm_low.yclk = 2214 1.1 riastrad radeon_dpm_get_mclk(rdev, true) * 10; 2215 1.1 riastrad wm_low.sclk = 2216 1.1 riastrad radeon_dpm_get_sclk(rdev, true) * 10; 2217 1.1 riastrad } else { 2218 1.1 riastrad wm_low.yclk = rdev->pm.current_mclk * 10; 2219 1.1 riastrad wm_low.sclk = rdev->pm.current_sclk * 10; 2220 1.1 riastrad } 2221 1.1 riastrad 2222 1.1 riastrad wm_low.disp_clk = mode->clock; 2223 1.1 riastrad wm_low.src_width = mode->crtc_hdisplay; 2224 1.5 riastrad wm_low.active_time = active_time; 2225 1.1 riastrad wm_low.blank_time = line_time - wm_low.active_time; 2226 1.1 riastrad wm_low.interlaced = false; 2227 1.1 riastrad if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2228 1.1 riastrad wm_low.interlaced = true; 2229 1.1 riastrad wm_low.vsc = radeon_crtc->vsc; 2230 1.1 riastrad wm_low.vtaps = 1; 2231 1.1 riastrad if (radeon_crtc->rmx_type != RMX_OFF) 2232 1.1 riastrad wm_low.vtaps = 2; 2233 1.1 riastrad wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */ 2234 1.1 riastrad wm_low.lb_size = lb_size; 2235 1.1 riastrad wm_low.dram_channels = dram_channels; 2236 1.1 riastrad wm_low.num_heads = num_heads; 2237 1.1 riastrad 2238 1.1 riastrad /* set for high clocks */ 2239 1.1 riastrad latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535); 2240 1.1 riastrad /* set for low clocks */ 2241 1.1 riastrad latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535); 2242 1.1 riastrad 2243 1.1 riastrad /* possibly force display priority to high */ 2244 1.1 riastrad /* should really do this at mode validation time... */ 2245 1.1 riastrad if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) || 2246 1.1 riastrad !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) || 2247 1.1 riastrad !evergreen_check_latency_hiding(&wm_high) || 2248 1.1 riastrad (rdev->disp_priority == 2)) { 2249 1.1 riastrad DRM_DEBUG_KMS("force priority a to high\n"); 2250 1.1 riastrad priority_a_cnt |= PRIORITY_ALWAYS_ON; 2251 1.1 riastrad } 2252 1.1 riastrad if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) || 2253 1.1 riastrad !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) || 2254 1.1 riastrad !evergreen_check_latency_hiding(&wm_low) || 2255 1.1 riastrad (rdev->disp_priority == 2)) { 2256 1.1 riastrad DRM_DEBUG_KMS("force priority b to high\n"); 2257 1.1 riastrad priority_b_cnt |= PRIORITY_ALWAYS_ON; 2258 1.1 riastrad } 2259 1.1 riastrad 2260 1.1 riastrad a.full = dfixed_const(1000); 2261 1.1 riastrad b.full = dfixed_const(mode->clock); 2262 1.1 riastrad b.full = dfixed_div(b, a); 2263 1.1 riastrad c.full = dfixed_const(latency_watermark_a); 2264 1.1 riastrad c.full = dfixed_mul(c, b); 2265 1.1 riastrad c.full = dfixed_mul(c, radeon_crtc->hsc); 2266 1.1 riastrad c.full = dfixed_div(c, a); 2267 1.1 riastrad a.full = dfixed_const(16); 2268 1.1 riastrad c.full = dfixed_div(c, a); 2269 1.1 riastrad priority_a_mark = dfixed_trunc(c); 2270 1.1 riastrad priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK; 2271 1.1 riastrad 2272 1.1 riastrad a.full = dfixed_const(1000); 2273 1.1 riastrad b.full = dfixed_const(mode->clock); 2274 1.1 riastrad b.full = dfixed_div(b, a); 2275 1.1 riastrad c.full = dfixed_const(latency_watermark_b); 2276 1.1 riastrad c.full = dfixed_mul(c, b); 2277 1.1 riastrad c.full = dfixed_mul(c, radeon_crtc->hsc); 2278 1.1 riastrad c.full = dfixed_div(c, a); 2279 1.1 riastrad a.full = dfixed_const(16); 2280 1.1 riastrad c.full = dfixed_div(c, a); 2281 1.1 riastrad priority_b_mark = dfixed_trunc(c); 2282 1.1 riastrad priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK; 2283 1.1 riastrad 2284 1.1 riastrad /* Save number of lines the linebuffer leads before the scanout */ 2285 1.1 riastrad radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay); 2286 1.1 riastrad } 2287 1.1 riastrad 2288 1.1 riastrad /* select wm A */ 2289 1.1 riastrad arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset); 2290 1.1 riastrad tmp = arb_control3; 2291 1.1 riastrad tmp &= ~LATENCY_WATERMARK_MASK(3); 2292 1.1 riastrad tmp |= LATENCY_WATERMARK_MASK(1); 2293 1.1 riastrad WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp); 2294 1.1 riastrad WREG32(PIPE0_LATENCY_CONTROL + pipe_offset, 2295 1.1 riastrad (LATENCY_LOW_WATERMARK(latency_watermark_a) | 2296 1.1 riastrad LATENCY_HIGH_WATERMARK(line_time))); 2297 1.1 riastrad /* select wm B */ 2298 1.1 riastrad tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset); 2299 1.1 riastrad tmp &= ~LATENCY_WATERMARK_MASK(3); 2300 1.1 riastrad tmp |= LATENCY_WATERMARK_MASK(2); 2301 1.1 riastrad WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp); 2302 1.1 riastrad WREG32(PIPE0_LATENCY_CONTROL + pipe_offset, 2303 1.1 riastrad (LATENCY_LOW_WATERMARK(latency_watermark_b) | 2304 1.1 riastrad LATENCY_HIGH_WATERMARK(line_time))); 2305 1.1 riastrad /* restore original selection */ 2306 1.1 riastrad WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3); 2307 1.1 riastrad 2308 1.1 riastrad /* write the priority marks */ 2309 1.1 riastrad WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt); 2310 1.1 riastrad WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt); 2311 1.1 riastrad 2312 1.1 riastrad /* save values for DPM */ 2313 1.1 riastrad radeon_crtc->line_time = line_time; 2314 1.1 riastrad radeon_crtc->wm_high = latency_watermark_a; 2315 1.1 riastrad radeon_crtc->wm_low = latency_watermark_b; 2316 1.1 riastrad } 2317 1.1 riastrad 2318 1.1 riastrad /** 2319 1.1 riastrad * evergreen_bandwidth_update - update display watermarks callback. 2320 1.1 riastrad * 2321 1.1 riastrad * @rdev: radeon_device pointer 2322 1.1 riastrad * 2323 1.1 riastrad * Update the display watermarks based on the requested mode(s) 2324 1.1 riastrad * (evergreen+). 2325 1.1 riastrad */ 2326 1.1 riastrad void evergreen_bandwidth_update(struct radeon_device *rdev) 2327 1.1 riastrad { 2328 1.1 riastrad struct drm_display_mode *mode0 = NULL; 2329 1.1 riastrad struct drm_display_mode *mode1 = NULL; 2330 1.1 riastrad u32 num_heads = 0, lb_size; 2331 1.1 riastrad int i; 2332 1.1 riastrad 2333 1.1 riastrad if (!rdev->mode_info.mode_config_initialized) 2334 1.1 riastrad return; 2335 1.1 riastrad 2336 1.1 riastrad radeon_update_display_priority(rdev); 2337 1.1 riastrad 2338 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2339 1.1 riastrad if (rdev->mode_info.crtcs[i]->base.enabled) 2340 1.1 riastrad num_heads++; 2341 1.1 riastrad } 2342 1.1 riastrad for (i = 0; i < rdev->num_crtc; i += 2) { 2343 1.1 riastrad mode0 = &rdev->mode_info.crtcs[i]->base.mode; 2344 1.1 riastrad mode1 = &rdev->mode_info.crtcs[i+1]->base.mode; 2345 1.1 riastrad lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1); 2346 1.1 riastrad evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads); 2347 1.1 riastrad lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0); 2348 1.1 riastrad evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads); 2349 1.1 riastrad } 2350 1.1 riastrad } 2351 1.1 riastrad 2352 1.1 riastrad /** 2353 1.1 riastrad * evergreen_mc_wait_for_idle - wait for MC idle callback. 2354 1.1 riastrad * 2355 1.1 riastrad * @rdev: radeon_device pointer 2356 1.1 riastrad * 2357 1.1 riastrad * Wait for the MC (memory controller) to be idle. 2358 1.1 riastrad * (evergreen+). 2359 1.1 riastrad * Returns 0 if the MC is idle, -1 if not. 2360 1.1 riastrad */ 2361 1.1 riastrad int evergreen_mc_wait_for_idle(struct radeon_device *rdev) 2362 1.1 riastrad { 2363 1.1 riastrad unsigned i; 2364 1.1 riastrad u32 tmp; 2365 1.1 riastrad 2366 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 2367 1.1 riastrad /* read MC_STATUS */ 2368 1.1 riastrad tmp = RREG32(SRBM_STATUS) & 0x1F00; 2369 1.1 riastrad if (!tmp) 2370 1.1 riastrad return 0; 2371 1.1 riastrad udelay(1); 2372 1.1 riastrad } 2373 1.1 riastrad return -1; 2374 1.1 riastrad } 2375 1.1 riastrad 2376 1.1 riastrad /* 2377 1.1 riastrad * GART 2378 1.1 riastrad */ 2379 1.1 riastrad void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev) 2380 1.1 riastrad { 2381 1.1 riastrad unsigned i; 2382 1.1 riastrad u32 tmp; 2383 1.1 riastrad 2384 1.1 riastrad WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 2385 1.1 riastrad 2386 1.1 riastrad WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1)); 2387 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 2388 1.1 riastrad /* read MC_STATUS */ 2389 1.1 riastrad tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE); 2390 1.1 riastrad tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT; 2391 1.1 riastrad if (tmp == 2) { 2392 1.5 riastrad pr_warn("[drm] r600 flush TLB failed\n"); 2393 1.1 riastrad return; 2394 1.1 riastrad } 2395 1.1 riastrad if (tmp) { 2396 1.1 riastrad return; 2397 1.1 riastrad } 2398 1.1 riastrad udelay(1); 2399 1.1 riastrad } 2400 1.1 riastrad } 2401 1.1 riastrad 2402 1.1 riastrad static int evergreen_pcie_gart_enable(struct radeon_device *rdev) 2403 1.1 riastrad { 2404 1.1 riastrad u32 tmp; 2405 1.1 riastrad int r; 2406 1.1 riastrad 2407 1.1 riastrad if (rdev->gart.robj == NULL) { 2408 1.1 riastrad dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 2409 1.1 riastrad return -EINVAL; 2410 1.1 riastrad } 2411 1.1 riastrad r = radeon_gart_table_vram_pin(rdev); 2412 1.1 riastrad if (r) 2413 1.1 riastrad return r; 2414 1.1 riastrad /* Setup L2 cache */ 2415 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 2416 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 2417 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 2418 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 2419 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 2420 1.1 riastrad /* Setup TLB control */ 2421 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 2422 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 2423 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 2424 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 2425 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 2426 1.1 riastrad WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp); 2427 1.1 riastrad WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp); 2428 1.1 riastrad WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp); 2429 1.1 riastrad } else { 2430 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 2431 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 2432 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 2433 1.1 riastrad if ((rdev->family == CHIP_JUNIPER) || 2434 1.1 riastrad (rdev->family == CHIP_CYPRESS) || 2435 1.1 riastrad (rdev->family == CHIP_HEMLOCK) || 2436 1.1 riastrad (rdev->family == CHIP_BARTS)) 2437 1.1 riastrad WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); 2438 1.1 riastrad } 2439 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 2440 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 2441 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 2442 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 2443 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 2444 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 2445 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 2446 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 2447 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 2448 1.1 riastrad WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 2449 1.1 riastrad (u32)(rdev->dummy_page.addr >> 12)); 2450 1.1 riastrad WREG32(VM_CONTEXT1_CNTL, 0); 2451 1.1 riastrad 2452 1.1 riastrad evergreen_pcie_gart_tlb_flush(rdev); 2453 1.1 riastrad DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 2454 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20), 2455 1.1 riastrad (unsigned long long)rdev->gart.table_addr); 2456 1.1 riastrad rdev->gart.ready = true; 2457 1.1 riastrad return 0; 2458 1.1 riastrad } 2459 1.1 riastrad 2460 1.1 riastrad static void evergreen_pcie_gart_disable(struct radeon_device *rdev) 2461 1.1 riastrad { 2462 1.1 riastrad u32 tmp; 2463 1.1 riastrad 2464 1.1 riastrad /* Disable all tables */ 2465 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, 0); 2466 1.1 riastrad WREG32(VM_CONTEXT1_CNTL, 0); 2467 1.1 riastrad 2468 1.1 riastrad /* Setup L2 cache */ 2469 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING | 2470 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 2471 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 2472 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 2473 1.1 riastrad /* Setup TLB control */ 2474 1.1 riastrad tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 2475 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 2476 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 2477 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 2478 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 2479 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 2480 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 2481 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 2482 1.1 riastrad radeon_gart_table_vram_unpin(rdev); 2483 1.1 riastrad } 2484 1.1 riastrad 2485 1.1 riastrad static void evergreen_pcie_gart_fini(struct radeon_device *rdev) 2486 1.1 riastrad { 2487 1.1 riastrad evergreen_pcie_gart_disable(rdev); 2488 1.1 riastrad radeon_gart_table_vram_free(rdev); 2489 1.1 riastrad radeon_gart_fini(rdev); 2490 1.1 riastrad } 2491 1.1 riastrad 2492 1.1 riastrad 2493 1.1 riastrad static void evergreen_agp_enable(struct radeon_device *rdev) 2494 1.1 riastrad { 2495 1.1 riastrad u32 tmp; 2496 1.1 riastrad 2497 1.1 riastrad /* Setup L2 cache */ 2498 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 2499 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 2500 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 2501 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 2502 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 2503 1.1 riastrad /* Setup TLB control */ 2504 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 2505 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 2506 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 2507 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 2508 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 2509 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 2510 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 2511 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 2512 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 2513 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 2514 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 2515 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, 0); 2516 1.1 riastrad WREG32(VM_CONTEXT1_CNTL, 0); 2517 1.1 riastrad } 2518 1.1 riastrad 2519 1.1 riastrad static const unsigned ni_dig_offsets[] = 2520 1.1 riastrad { 2521 1.1 riastrad NI_DIG0_REGISTER_OFFSET, 2522 1.1 riastrad NI_DIG1_REGISTER_OFFSET, 2523 1.1 riastrad NI_DIG2_REGISTER_OFFSET, 2524 1.1 riastrad NI_DIG3_REGISTER_OFFSET, 2525 1.1 riastrad NI_DIG4_REGISTER_OFFSET, 2526 1.1 riastrad NI_DIG5_REGISTER_OFFSET 2527 1.1 riastrad }; 2528 1.1 riastrad 2529 1.1 riastrad static const unsigned ni_tx_offsets[] = 2530 1.1 riastrad { 2531 1.1 riastrad NI_DCIO_UNIPHY0_UNIPHY_TX_CONTROL1, 2532 1.1 riastrad NI_DCIO_UNIPHY1_UNIPHY_TX_CONTROL1, 2533 1.1 riastrad NI_DCIO_UNIPHY2_UNIPHY_TX_CONTROL1, 2534 1.1 riastrad NI_DCIO_UNIPHY3_UNIPHY_TX_CONTROL1, 2535 1.1 riastrad NI_DCIO_UNIPHY4_UNIPHY_TX_CONTROL1, 2536 1.1 riastrad NI_DCIO_UNIPHY5_UNIPHY_TX_CONTROL1 2537 1.1 riastrad }; 2538 1.1 riastrad 2539 1.1 riastrad static const unsigned evergreen_dp_offsets[] = 2540 1.1 riastrad { 2541 1.1 riastrad EVERGREEN_DP0_REGISTER_OFFSET, 2542 1.1 riastrad EVERGREEN_DP1_REGISTER_OFFSET, 2543 1.1 riastrad EVERGREEN_DP2_REGISTER_OFFSET, 2544 1.1 riastrad EVERGREEN_DP3_REGISTER_OFFSET, 2545 1.1 riastrad EVERGREEN_DP4_REGISTER_OFFSET, 2546 1.1 riastrad EVERGREEN_DP5_REGISTER_OFFSET 2547 1.1 riastrad }; 2548 1.1 riastrad 2549 1.5 riastrad static const unsigned evergreen_disp_int_status[] = 2550 1.5 riastrad { 2551 1.5 riastrad DISP_INTERRUPT_STATUS, 2552 1.5 riastrad DISP_INTERRUPT_STATUS_CONTINUE, 2553 1.5 riastrad DISP_INTERRUPT_STATUS_CONTINUE2, 2554 1.5 riastrad DISP_INTERRUPT_STATUS_CONTINUE3, 2555 1.5 riastrad DISP_INTERRUPT_STATUS_CONTINUE4, 2556 1.5 riastrad DISP_INTERRUPT_STATUS_CONTINUE5 2557 1.5 riastrad }; 2558 1.1 riastrad 2559 1.1 riastrad /* 2560 1.1 riastrad * Assumption is that EVERGREEN_CRTC_MASTER_EN enable for requested crtc 2561 1.1 riastrad * We go from crtc to connector and it is not relible since it 2562 1.1 riastrad * should be an opposite direction .If crtc is enable then 2563 1.1 riastrad * find the dig_fe which selects this crtc and insure that it enable. 2564 1.1 riastrad * if such dig_fe is found then find dig_be which selects found dig_be and 2565 1.1 riastrad * insure that it enable and in DP_SST mode. 2566 1.1 riastrad * if UNIPHY_PLL_CONTROL1.enable then we should disconnect timing 2567 1.1 riastrad * from dp symbols clocks . 2568 1.1 riastrad */ 2569 1.1 riastrad static bool evergreen_is_dp_sst_stream_enabled(struct radeon_device *rdev, 2570 1.1 riastrad unsigned crtc_id, unsigned *ret_dig_fe) 2571 1.1 riastrad { 2572 1.1 riastrad unsigned i; 2573 1.1 riastrad unsigned dig_fe; 2574 1.1 riastrad unsigned dig_be; 2575 1.1 riastrad unsigned dig_en_be; 2576 1.1 riastrad unsigned uniphy_pll; 2577 1.1 riastrad unsigned digs_fe_selected; 2578 1.1 riastrad unsigned dig_be_mode; 2579 1.1 riastrad unsigned dig_fe_mask; 2580 1.1 riastrad bool is_enabled = false; 2581 1.1 riastrad bool found_crtc = false; 2582 1.1 riastrad 2583 1.1 riastrad /* loop through all running dig_fe to find selected crtc */ 2584 1.1 riastrad for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) { 2585 1.1 riastrad dig_fe = RREG32(NI_DIG_FE_CNTL + ni_dig_offsets[i]); 2586 1.1 riastrad if (dig_fe & NI_DIG_FE_CNTL_SYMCLK_FE_ON && 2587 1.1 riastrad crtc_id == NI_DIG_FE_CNTL_SOURCE_SELECT(dig_fe)) { 2588 1.1 riastrad /* found running pipe */ 2589 1.1 riastrad found_crtc = true; 2590 1.1 riastrad dig_fe_mask = 1 << i; 2591 1.1 riastrad dig_fe = i; 2592 1.1 riastrad break; 2593 1.1 riastrad } 2594 1.1 riastrad } 2595 1.1 riastrad 2596 1.1 riastrad if (found_crtc) { 2597 1.1 riastrad /* loop through all running dig_be to find selected dig_fe */ 2598 1.1 riastrad for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) { 2599 1.1 riastrad dig_be = RREG32(NI_DIG_BE_CNTL + ni_dig_offsets[i]); 2600 1.1 riastrad /* if dig_fe_selected by dig_be? */ 2601 1.1 riastrad digs_fe_selected = NI_DIG_BE_CNTL_FE_SOURCE_SELECT(dig_be); 2602 1.1 riastrad dig_be_mode = NI_DIG_FE_CNTL_MODE(dig_be); 2603 1.1 riastrad if (dig_fe_mask & digs_fe_selected && 2604 1.1 riastrad /* if dig_be in sst mode? */ 2605 1.1 riastrad dig_be_mode == NI_DIG_BE_DPSST) { 2606 1.1 riastrad dig_en_be = RREG32(NI_DIG_BE_EN_CNTL + 2607 1.1 riastrad ni_dig_offsets[i]); 2608 1.1 riastrad uniphy_pll = RREG32(NI_DCIO_UNIPHY0_PLL_CONTROL1 + 2609 1.1 riastrad ni_tx_offsets[i]); 2610 1.1 riastrad /* dig_be enable and tx is running */ 2611 1.1 riastrad if (dig_en_be & NI_DIG_BE_EN_CNTL_ENABLE && 2612 1.1 riastrad dig_en_be & NI_DIG_BE_EN_CNTL_SYMBCLK_ON && 2613 1.1 riastrad uniphy_pll & NI_DCIO_UNIPHY0_PLL_CONTROL1_ENABLE) { 2614 1.1 riastrad is_enabled = true; 2615 1.1 riastrad *ret_dig_fe = dig_fe; 2616 1.1 riastrad break; 2617 1.1 riastrad } 2618 1.1 riastrad } 2619 1.1 riastrad } 2620 1.1 riastrad } 2621 1.1 riastrad 2622 1.1 riastrad return is_enabled; 2623 1.1 riastrad } 2624 1.1 riastrad 2625 1.1 riastrad /* 2626 1.1 riastrad * Blank dig when in dp sst mode 2627 1.1 riastrad * Dig ignores crtc timing 2628 1.1 riastrad */ 2629 1.1 riastrad static void evergreen_blank_dp_output(struct radeon_device *rdev, 2630 1.1 riastrad unsigned dig_fe) 2631 1.1 riastrad { 2632 1.1 riastrad unsigned stream_ctrl; 2633 1.1 riastrad unsigned fifo_ctrl; 2634 1.1 riastrad unsigned counter = 0; 2635 1.1 riastrad 2636 1.1 riastrad if (dig_fe >= ARRAY_SIZE(evergreen_dp_offsets)) { 2637 1.1 riastrad DRM_ERROR("invalid dig_fe %d\n", dig_fe); 2638 1.1 riastrad return; 2639 1.1 riastrad } 2640 1.1 riastrad 2641 1.1 riastrad stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL + 2642 1.1 riastrad evergreen_dp_offsets[dig_fe]); 2643 1.1 riastrad if (!(stream_ctrl & EVERGREEN_DP_VID_STREAM_CNTL_ENABLE)) { 2644 1.1 riastrad DRM_ERROR("dig %d , should be enable\n", dig_fe); 2645 1.1 riastrad return; 2646 1.1 riastrad } 2647 1.1 riastrad 2648 1.1 riastrad stream_ctrl &=~EVERGREEN_DP_VID_STREAM_CNTL_ENABLE; 2649 1.1 riastrad WREG32(EVERGREEN_DP_VID_STREAM_CNTL + 2650 1.1 riastrad evergreen_dp_offsets[dig_fe], stream_ctrl); 2651 1.1 riastrad 2652 1.1 riastrad stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL + 2653 1.1 riastrad evergreen_dp_offsets[dig_fe]); 2654 1.1 riastrad while (counter < 32 && stream_ctrl & EVERGREEN_DP_VID_STREAM_STATUS) { 2655 1.1 riastrad msleep(1); 2656 1.1 riastrad counter++; 2657 1.1 riastrad stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL + 2658 1.1 riastrad evergreen_dp_offsets[dig_fe]); 2659 1.1 riastrad } 2660 1.1 riastrad if (counter >= 32 ) 2661 1.1 riastrad DRM_ERROR("counter exceeds %d\n", counter); 2662 1.1 riastrad 2663 1.1 riastrad fifo_ctrl = RREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe]); 2664 1.1 riastrad fifo_ctrl |= EVERGREEN_DP_STEER_FIFO_RESET; 2665 1.1 riastrad WREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe], fifo_ctrl); 2666 1.1 riastrad 2667 1.1 riastrad } 2668 1.1 riastrad 2669 1.1 riastrad void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save) 2670 1.1 riastrad { 2671 1.1 riastrad u32 crtc_enabled, tmp, frame_count, blackout; 2672 1.1 riastrad int i, j; 2673 1.1 riastrad unsigned dig_fe; 2674 1.1 riastrad 2675 1.1 riastrad if (!ASIC_IS_NODCE(rdev)) { 2676 1.1 riastrad save->vga_render_control = RREG32(VGA_RENDER_CONTROL); 2677 1.1 riastrad save->vga_hdp_control = RREG32(VGA_HDP_CONTROL); 2678 1.1 riastrad 2679 1.1 riastrad /* disable VGA render */ 2680 1.1 riastrad WREG32(VGA_RENDER_CONTROL, 0); 2681 1.1 riastrad } 2682 1.1 riastrad /* blank the display controllers */ 2683 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2684 1.1 riastrad crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN; 2685 1.1 riastrad if (crtc_enabled) { 2686 1.1 riastrad save->crtc_enabled[i] = true; 2687 1.1 riastrad if (ASIC_IS_DCE6(rdev)) { 2688 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); 2689 1.1 riastrad if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) { 2690 1.1 riastrad radeon_wait_for_vblank(rdev, i); 2691 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2692 1.1 riastrad tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; 2693 1.1 riastrad WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); 2694 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 2695 1.1 riastrad } 2696 1.1 riastrad } else { 2697 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); 2698 1.1 riastrad if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) { 2699 1.1 riastrad radeon_wait_for_vblank(rdev, i); 2700 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2701 1.1 riastrad tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; 2702 1.1 riastrad WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); 2703 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 2704 1.1 riastrad } 2705 1.1 riastrad } 2706 1.1 riastrad /* wait for the next frame */ 2707 1.1 riastrad frame_count = radeon_get_vblank_counter(rdev, i); 2708 1.1 riastrad for (j = 0; j < rdev->usec_timeout; j++) { 2709 1.1 riastrad if (radeon_get_vblank_counter(rdev, i) != frame_count) 2710 1.1 riastrad break; 2711 1.1 riastrad udelay(1); 2712 1.1 riastrad } 2713 1.1 riastrad /*we should disable dig if it drives dp sst*/ 2714 1.1 riastrad /*but we are in radeon_device_init and the topology is unknown*/ 2715 1.1 riastrad /*and it is available after radeon_modeset_init*/ 2716 1.1 riastrad /*the following method radeon_atom_encoder_dpms_dig*/ 2717 1.1 riastrad /*does the job if we initialize it properly*/ 2718 1.1 riastrad /*for now we do it this manually*/ 2719 1.1 riastrad /**/ 2720 1.1 riastrad if (ASIC_IS_DCE5(rdev) && 2721 1.1 riastrad evergreen_is_dp_sst_stream_enabled(rdev, i ,&dig_fe)) 2722 1.1 riastrad evergreen_blank_dp_output(rdev, dig_fe); 2723 1.1 riastrad /*we could remove 6 lines below*/ 2724 1.1 riastrad /* XXX this is a hack to avoid strange behavior with EFI on certain systems */ 2725 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2726 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); 2727 1.1 riastrad tmp &= ~EVERGREEN_CRTC_MASTER_EN; 2728 1.1 riastrad WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); 2729 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 2730 1.1 riastrad save->crtc_enabled[i] = false; 2731 1.1 riastrad /* ***** */ 2732 1.1 riastrad } else { 2733 1.1 riastrad save->crtc_enabled[i] = false; 2734 1.1 riastrad } 2735 1.1 riastrad } 2736 1.1 riastrad 2737 1.1 riastrad radeon_mc_wait_for_idle(rdev); 2738 1.1 riastrad 2739 1.1 riastrad blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); 2740 1.1 riastrad if ((blackout & BLACKOUT_MODE_MASK) != 1) { 2741 1.1 riastrad /* Block CPU access */ 2742 1.1 riastrad WREG32(BIF_FB_EN, 0); 2743 1.1 riastrad /* blackout the MC */ 2744 1.1 riastrad blackout &= ~BLACKOUT_MODE_MASK; 2745 1.1 riastrad WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1); 2746 1.1 riastrad } 2747 1.1 riastrad /* wait for the MC to settle */ 2748 1.1 riastrad udelay(100); 2749 1.1 riastrad 2750 1.1 riastrad /* lock double buffered regs */ 2751 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2752 1.1 riastrad if (save->crtc_enabled[i]) { 2753 1.1 riastrad tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]); 2754 1.1 riastrad if (!(tmp & EVERGREEN_GRPH_UPDATE_LOCK)) { 2755 1.1 riastrad tmp |= EVERGREEN_GRPH_UPDATE_LOCK; 2756 1.1 riastrad WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp); 2757 1.1 riastrad } 2758 1.1 riastrad tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]); 2759 1.1 riastrad if (!(tmp & 1)) { 2760 1.1 riastrad tmp |= 1; 2761 1.1 riastrad WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp); 2762 1.1 riastrad } 2763 1.1 riastrad } 2764 1.1 riastrad } 2765 1.1 riastrad } 2766 1.1 riastrad 2767 1.1 riastrad void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) 2768 1.1 riastrad { 2769 1.1 riastrad u32 tmp, frame_count; 2770 1.1 riastrad int i, j; 2771 1.1 riastrad 2772 1.1 riastrad /* update crtc base addresses */ 2773 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2774 1.1 riastrad WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i], 2775 1.1 riastrad upper_32_bits(rdev->mc.vram_start)); 2776 1.1 riastrad WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i], 2777 1.1 riastrad upper_32_bits(rdev->mc.vram_start)); 2778 1.1 riastrad WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i], 2779 1.1 riastrad (u32)rdev->mc.vram_start); 2780 1.1 riastrad WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i], 2781 1.1 riastrad (u32)rdev->mc.vram_start); 2782 1.1 riastrad } 2783 1.1 riastrad 2784 1.1 riastrad if (!ASIC_IS_NODCE(rdev)) { 2785 1.1 riastrad WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start)); 2786 1.1 riastrad WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start); 2787 1.1 riastrad } 2788 1.1 riastrad 2789 1.1 riastrad /* unlock regs and wait for update */ 2790 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2791 1.1 riastrad if (save->crtc_enabled[i]) { 2792 1.1 riastrad tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]); 2793 1.5 riastrad if ((tmp & 0x7) != 0) { 2794 1.1 riastrad tmp &= ~0x7; 2795 1.1 riastrad WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp); 2796 1.1 riastrad } 2797 1.1 riastrad tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]); 2798 1.1 riastrad if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) { 2799 1.1 riastrad tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK; 2800 1.1 riastrad WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp); 2801 1.1 riastrad } 2802 1.1 riastrad tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]); 2803 1.1 riastrad if (tmp & 1) { 2804 1.1 riastrad tmp &= ~1; 2805 1.1 riastrad WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp); 2806 1.1 riastrad } 2807 1.1 riastrad for (j = 0; j < rdev->usec_timeout; j++) { 2808 1.1 riastrad tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]); 2809 1.1 riastrad if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0) 2810 1.1 riastrad break; 2811 1.1 riastrad udelay(1); 2812 1.1 riastrad } 2813 1.1 riastrad } 2814 1.1 riastrad } 2815 1.1 riastrad 2816 1.1 riastrad /* unblackout the MC */ 2817 1.1 riastrad tmp = RREG32(MC_SHARED_BLACKOUT_CNTL); 2818 1.1 riastrad tmp &= ~BLACKOUT_MODE_MASK; 2819 1.1 riastrad WREG32(MC_SHARED_BLACKOUT_CNTL, tmp); 2820 1.1 riastrad /* allow CPU access */ 2821 1.1 riastrad WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN); 2822 1.1 riastrad 2823 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 2824 1.1 riastrad if (save->crtc_enabled[i]) { 2825 1.1 riastrad if (ASIC_IS_DCE6(rdev)) { 2826 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); 2827 1.1 riastrad tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN; 2828 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2829 1.1 riastrad WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); 2830 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 2831 1.1 riastrad } else { 2832 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); 2833 1.1 riastrad tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; 2834 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2835 1.1 riastrad WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); 2836 1.1 riastrad WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 2837 1.1 riastrad } 2838 1.1 riastrad /* wait for the next frame */ 2839 1.1 riastrad frame_count = radeon_get_vblank_counter(rdev, i); 2840 1.1 riastrad for (j = 0; j < rdev->usec_timeout; j++) { 2841 1.1 riastrad if (radeon_get_vblank_counter(rdev, i) != frame_count) 2842 1.1 riastrad break; 2843 1.1 riastrad udelay(1); 2844 1.1 riastrad } 2845 1.1 riastrad } 2846 1.1 riastrad } 2847 1.1 riastrad if (!ASIC_IS_NODCE(rdev)) { 2848 1.1 riastrad /* Unlock vga access */ 2849 1.1 riastrad WREG32(VGA_HDP_CONTROL, save->vga_hdp_control); 2850 1.1 riastrad mdelay(1); 2851 1.1 riastrad WREG32(VGA_RENDER_CONTROL, save->vga_render_control); 2852 1.1 riastrad } 2853 1.1 riastrad } 2854 1.1 riastrad 2855 1.1 riastrad void evergreen_mc_program(struct radeon_device *rdev) 2856 1.1 riastrad { 2857 1.1 riastrad struct evergreen_mc_save save; 2858 1.1 riastrad u32 tmp; 2859 1.1 riastrad int i, j; 2860 1.1 riastrad 2861 1.1 riastrad /* Initialize HDP */ 2862 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 2863 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 2864 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 2865 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 2866 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 2867 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 2868 1.1 riastrad } 2869 1.1 riastrad WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); 2870 1.1 riastrad 2871 1.1 riastrad evergreen_mc_stop(rdev, &save); 2872 1.1 riastrad if (evergreen_mc_wait_for_idle(rdev)) { 2873 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2874 1.1 riastrad } 2875 1.1 riastrad /* Lockout access through VGA aperture*/ 2876 1.1 riastrad WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); 2877 1.1 riastrad /* Update configuration */ 2878 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 2879 1.1 riastrad if (rdev->mc.vram_start < rdev->mc.gtt_start) { 2880 1.1 riastrad /* VRAM before AGP */ 2881 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 2882 1.1 riastrad rdev->mc.vram_start >> 12); 2883 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 2884 1.1 riastrad rdev->mc.gtt_end >> 12); 2885 1.1 riastrad } else { 2886 1.1 riastrad /* VRAM after AGP */ 2887 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 2888 1.1 riastrad rdev->mc.gtt_start >> 12); 2889 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 2890 1.1 riastrad rdev->mc.vram_end >> 12); 2891 1.1 riastrad } 2892 1.1 riastrad } else { 2893 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 2894 1.1 riastrad rdev->mc.vram_start >> 12); 2895 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 2896 1.1 riastrad rdev->mc.vram_end >> 12); 2897 1.1 riastrad } 2898 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); 2899 1.1 riastrad /* llano/ontario only */ 2900 1.1 riastrad if ((rdev->family == CHIP_PALM) || 2901 1.1 riastrad (rdev->family == CHIP_SUMO) || 2902 1.1 riastrad (rdev->family == CHIP_SUMO2)) { 2903 1.1 riastrad tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF; 2904 1.1 riastrad tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24; 2905 1.1 riastrad tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20; 2906 1.1 riastrad WREG32(MC_FUS_VM_FB_OFFSET, tmp); 2907 1.1 riastrad } 2908 1.1 riastrad tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; 2909 1.1 riastrad tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 2910 1.1 riastrad WREG32(MC_VM_FB_LOCATION, tmp); 2911 1.1 riastrad WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 2912 1.1 riastrad WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30)); 2913 1.1 riastrad WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 2914 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 2915 1.1 riastrad WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); 2916 1.1 riastrad WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); 2917 1.1 riastrad WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); 2918 1.1 riastrad } else { 2919 1.1 riastrad WREG32(MC_VM_AGP_BASE, 0); 2920 1.1 riastrad WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); 2921 1.1 riastrad WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); 2922 1.1 riastrad } 2923 1.1 riastrad if (evergreen_mc_wait_for_idle(rdev)) { 2924 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2925 1.1 riastrad } 2926 1.1 riastrad evergreen_mc_resume(rdev, &save); 2927 1.1 riastrad /* we need to own VRAM, so turn off the VGA renderer here 2928 1.1 riastrad * to stop it overwriting our objects */ 2929 1.1 riastrad rv515_vga_render_disable(rdev); 2930 1.1 riastrad } 2931 1.1 riastrad 2932 1.1 riastrad /* 2933 1.1 riastrad * CP. 2934 1.1 riastrad */ 2935 1.1 riastrad void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 2936 1.1 riastrad { 2937 1.1 riastrad struct radeon_ring *ring = &rdev->ring[ib->ring]; 2938 1.1 riastrad u32 next_rptr; 2939 1.1 riastrad 2940 1.1 riastrad /* set to DX10/11 mode */ 2941 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); 2942 1.1 riastrad radeon_ring_write(ring, 1); 2943 1.1 riastrad 2944 1.1 riastrad if (ring->rptr_save_reg) { 2945 1.1 riastrad next_rptr = ring->wptr + 3 + 4; 2946 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2947 1.1 riastrad radeon_ring_write(ring, ((ring->rptr_save_reg - 2948 1.1 riastrad PACKET3_SET_CONFIG_REG_START) >> 2)); 2949 1.1 riastrad radeon_ring_write(ring, next_rptr); 2950 1.1 riastrad } else if (rdev->wb.enabled) { 2951 1.1 riastrad next_rptr = ring->wptr + 5 + 4; 2952 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3)); 2953 1.1 riastrad radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 2954 1.1 riastrad radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18)); 2955 1.1 riastrad radeon_ring_write(ring, next_rptr); 2956 1.1 riastrad radeon_ring_write(ring, 0); 2957 1.1 riastrad } 2958 1.1 riastrad 2959 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 2960 1.1 riastrad radeon_ring_write(ring, 2961 1.1 riastrad #ifdef __BIG_ENDIAN 2962 1.1 riastrad (2 << 0) | 2963 1.1 riastrad #endif 2964 1.1 riastrad (ib->gpu_addr & 0xFFFFFFFC)); 2965 1.1 riastrad radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF); 2966 1.1 riastrad radeon_ring_write(ring, ib->length_dw); 2967 1.1 riastrad } 2968 1.1 riastrad 2969 1.1 riastrad 2970 1.1 riastrad static int evergreen_cp_load_microcode(struct radeon_device *rdev) 2971 1.1 riastrad { 2972 1.1 riastrad const __be32 *fw_data; 2973 1.1 riastrad int i; 2974 1.1 riastrad 2975 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw) 2976 1.1 riastrad return -EINVAL; 2977 1.1 riastrad 2978 1.1 riastrad r700_cp_stop(rdev); 2979 1.1 riastrad WREG32(CP_RB_CNTL, 2980 1.1 riastrad #ifdef __BIG_ENDIAN 2981 1.1 riastrad BUF_SWAP_32BIT | 2982 1.1 riastrad #endif 2983 1.1 riastrad RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); 2984 1.1 riastrad 2985 1.1 riastrad fw_data = (const __be32 *)rdev->pfp_fw->data; 2986 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 2987 1.1 riastrad for (i = 0; i < EVERGREEN_PFP_UCODE_SIZE; i++) 2988 1.1 riastrad WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 2989 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 2990 1.1 riastrad 2991 1.1 riastrad fw_data = (const __be32 *)rdev->me_fw->data; 2992 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 2993 1.1 riastrad for (i = 0; i < EVERGREEN_PM4_UCODE_SIZE; i++) 2994 1.1 riastrad WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 2995 1.1 riastrad 2996 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 2997 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 2998 1.1 riastrad WREG32(CP_ME_RAM_RADDR, 0); 2999 1.1 riastrad return 0; 3000 1.1 riastrad } 3001 1.1 riastrad 3002 1.1 riastrad static int evergreen_cp_start(struct radeon_device *rdev) 3003 1.1 riastrad { 3004 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 3005 1.1 riastrad int r, i; 3006 1.1 riastrad uint32_t cp_me; 3007 1.1 riastrad 3008 1.1 riastrad r = radeon_ring_lock(rdev, ring, 7); 3009 1.1 riastrad if (r) { 3010 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 3011 1.1 riastrad return r; 3012 1.1 riastrad } 3013 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5)); 3014 1.1 riastrad radeon_ring_write(ring, 0x1); 3015 1.1 riastrad radeon_ring_write(ring, 0x0); 3016 1.1 riastrad radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1); 3017 1.1 riastrad radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); 3018 1.1 riastrad radeon_ring_write(ring, 0); 3019 1.1 riastrad radeon_ring_write(ring, 0); 3020 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 3021 1.1 riastrad 3022 1.1 riastrad cp_me = 0xff; 3023 1.1 riastrad WREG32(CP_ME_CNTL, cp_me); 3024 1.1 riastrad 3025 1.1 riastrad r = radeon_ring_lock(rdev, ring, evergreen_default_size + 19); 3026 1.1 riastrad if (r) { 3027 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 3028 1.1 riastrad return r; 3029 1.1 riastrad } 3030 1.1 riastrad 3031 1.1 riastrad /* setup clear context state */ 3032 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 3033 1.1 riastrad radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); 3034 1.1 riastrad 3035 1.1 riastrad for (i = 0; i < evergreen_default_size; i++) 3036 1.1 riastrad radeon_ring_write(ring, evergreen_default_state[i]); 3037 1.1 riastrad 3038 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 3039 1.1 riastrad radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); 3040 1.1 riastrad 3041 1.1 riastrad /* set clear context state */ 3042 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0)); 3043 1.1 riastrad radeon_ring_write(ring, 0); 3044 1.1 riastrad 3045 1.1 riastrad /* SQ_VTX_BASE_VTX_LOC */ 3046 1.1 riastrad radeon_ring_write(ring, 0xc0026f00); 3047 1.1 riastrad radeon_ring_write(ring, 0x00000000); 3048 1.1 riastrad radeon_ring_write(ring, 0x00000000); 3049 1.1 riastrad radeon_ring_write(ring, 0x00000000); 3050 1.1 riastrad 3051 1.1 riastrad /* Clear consts */ 3052 1.1 riastrad radeon_ring_write(ring, 0xc0036f00); 3053 1.1 riastrad radeon_ring_write(ring, 0x00000bc4); 3054 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 3055 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 3056 1.1 riastrad radeon_ring_write(ring, 0xffffffff); 3057 1.1 riastrad 3058 1.1 riastrad radeon_ring_write(ring, 0xc0026900); 3059 1.1 riastrad radeon_ring_write(ring, 0x00000316); 3060 1.1 riastrad radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ 3061 1.1 riastrad radeon_ring_write(ring, 0x00000010); /* */ 3062 1.1 riastrad 3063 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 3064 1.1 riastrad 3065 1.1 riastrad return 0; 3066 1.1 riastrad } 3067 1.1 riastrad 3068 1.1 riastrad static int evergreen_cp_resume(struct radeon_device *rdev) 3069 1.1 riastrad { 3070 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 3071 1.1 riastrad u32 tmp; 3072 1.1 riastrad u32 rb_bufsz; 3073 1.1 riastrad int r; 3074 1.1 riastrad 3075 1.1 riastrad /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */ 3076 1.1 riastrad WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP | 3077 1.1 riastrad SOFT_RESET_PA | 3078 1.1 riastrad SOFT_RESET_SH | 3079 1.1 riastrad SOFT_RESET_VGT | 3080 1.1 riastrad SOFT_RESET_SPI | 3081 1.1 riastrad SOFT_RESET_SX)); 3082 1.1 riastrad RREG32(GRBM_SOFT_RESET); 3083 1.1 riastrad mdelay(15); 3084 1.1 riastrad WREG32(GRBM_SOFT_RESET, 0); 3085 1.1 riastrad RREG32(GRBM_SOFT_RESET); 3086 1.1 riastrad 3087 1.1 riastrad /* Set ring buffer size */ 3088 1.1 riastrad rb_bufsz = order_base_2(ring->ring_size / 8); 3089 1.1 riastrad tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; 3090 1.1 riastrad #ifdef __BIG_ENDIAN 3091 1.1 riastrad tmp |= BUF_SWAP_32BIT; 3092 1.1 riastrad #endif 3093 1.1 riastrad WREG32(CP_RB_CNTL, tmp); 3094 1.1 riastrad WREG32(CP_SEM_WAIT_TIMER, 0x0); 3095 1.1 riastrad WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); 3096 1.1 riastrad 3097 1.1 riastrad /* Set the write pointer delay */ 3098 1.1 riastrad WREG32(CP_RB_WPTR_DELAY, 0); 3099 1.1 riastrad 3100 1.1 riastrad /* Initialize the ring buffer's read and write pointers */ 3101 1.1 riastrad WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); 3102 1.1 riastrad WREG32(CP_RB_RPTR_WR, 0); 3103 1.1 riastrad ring->wptr = 0; 3104 1.1 riastrad WREG32(CP_RB_WPTR, ring->wptr); 3105 1.1 riastrad 3106 1.1 riastrad /* set the wb address whether it's enabled or not */ 3107 1.1 riastrad WREG32(CP_RB_RPTR_ADDR, 3108 1.1 riastrad ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); 3109 1.1 riastrad WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); 3110 1.1 riastrad WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); 3111 1.1 riastrad 3112 1.1 riastrad if (rdev->wb.enabled) 3113 1.1 riastrad WREG32(SCRATCH_UMSK, 0xff); 3114 1.1 riastrad else { 3115 1.1 riastrad tmp |= RB_NO_UPDATE; 3116 1.1 riastrad WREG32(SCRATCH_UMSK, 0); 3117 1.1 riastrad } 3118 1.1 riastrad 3119 1.1 riastrad mdelay(1); 3120 1.1 riastrad WREG32(CP_RB_CNTL, tmp); 3121 1.1 riastrad 3122 1.1 riastrad WREG32(CP_RB_BASE, ring->gpu_addr >> 8); 3123 1.1 riastrad WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); 3124 1.1 riastrad 3125 1.1 riastrad evergreen_cp_start(rdev); 3126 1.1 riastrad ring->ready = true; 3127 1.1 riastrad r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); 3128 1.1 riastrad if (r) { 3129 1.1 riastrad ring->ready = false; 3130 1.1 riastrad return r; 3131 1.1 riastrad } 3132 1.1 riastrad return 0; 3133 1.1 riastrad } 3134 1.1 riastrad 3135 1.1 riastrad /* 3136 1.1 riastrad * Core functions 3137 1.1 riastrad */ 3138 1.1 riastrad static void evergreen_gpu_init(struct radeon_device *rdev) 3139 1.1 riastrad { 3140 1.1 riastrad u32 gb_addr_config; 3141 1.1 riastrad u32 mc_shared_chmap __unused, mc_arb_ramcfg; 3142 1.1 riastrad u32 sx_debug_1; 3143 1.1 riastrad u32 smx_dc_ctl0; 3144 1.1 riastrad u32 sq_config; 3145 1.1 riastrad u32 sq_lds_resource_mgmt; 3146 1.1 riastrad u32 sq_gpr_resource_mgmt_1; 3147 1.1 riastrad u32 sq_gpr_resource_mgmt_2; 3148 1.1 riastrad u32 sq_gpr_resource_mgmt_3; 3149 1.1 riastrad u32 sq_thread_resource_mgmt; 3150 1.1 riastrad u32 sq_thread_resource_mgmt_2; 3151 1.1 riastrad u32 sq_stack_resource_mgmt_1; 3152 1.1 riastrad u32 sq_stack_resource_mgmt_2; 3153 1.1 riastrad u32 sq_stack_resource_mgmt_3; 3154 1.1 riastrad u32 vgt_cache_invalidation; 3155 1.1 riastrad u32 hdp_host_path_cntl, tmp; 3156 1.1 riastrad u32 disabled_rb_mask; 3157 1.1 riastrad int i, j, ps_thread_count; 3158 1.1 riastrad 3159 1.1 riastrad switch (rdev->family) { 3160 1.1 riastrad case CHIP_CYPRESS: 3161 1.1 riastrad case CHIP_HEMLOCK: 3162 1.1 riastrad rdev->config.evergreen.num_ses = 2; 3163 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3164 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 8; 3165 1.1 riastrad rdev->config.evergreen.max_simds = 10; 3166 1.1 riastrad rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses; 3167 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3168 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3169 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3170 1.1 riastrad rdev->config.evergreen.max_stack_entries = 512; 3171 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3172 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3173 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3174 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3175 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3176 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3177 1.1 riastrad 3178 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x100; 3179 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3180 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3181 1.1 riastrad gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN; 3182 1.1 riastrad break; 3183 1.1 riastrad case CHIP_JUNIPER: 3184 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3185 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3186 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 4; 3187 1.1 riastrad rdev->config.evergreen.max_simds = 10; 3188 1.1 riastrad rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses; 3189 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3190 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3191 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3192 1.1 riastrad rdev->config.evergreen.max_stack_entries = 512; 3193 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3194 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3195 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3196 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3197 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3198 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3199 1.1 riastrad 3200 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x100; 3201 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3202 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3203 1.1 riastrad gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN; 3204 1.1 riastrad break; 3205 1.1 riastrad case CHIP_REDWOOD: 3206 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3207 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3208 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 4; 3209 1.1 riastrad rdev->config.evergreen.max_simds = 5; 3210 1.1 riastrad rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; 3211 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3212 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3213 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3214 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3215 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3216 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3217 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3218 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3219 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3220 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3221 1.1 riastrad 3222 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x100; 3223 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3224 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3225 1.1 riastrad gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; 3226 1.1 riastrad break; 3227 1.1 riastrad case CHIP_CEDAR: 3228 1.1 riastrad default: 3229 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3230 1.1 riastrad rdev->config.evergreen.max_pipes = 2; 3231 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 2; 3232 1.1 riastrad rdev->config.evergreen.max_simds = 2; 3233 1.1 riastrad rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; 3234 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3235 1.1 riastrad rdev->config.evergreen.max_threads = 192; 3236 1.1 riastrad rdev->config.evergreen.max_gs_threads = 16; 3237 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3238 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3239 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 128; 3240 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 32; 3241 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 96; 3242 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 4; 3243 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 1; 3244 1.1 riastrad 3245 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x40; 3246 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3247 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3248 1.1 riastrad gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN; 3249 1.1 riastrad break; 3250 1.1 riastrad case CHIP_PALM: 3251 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3252 1.1 riastrad rdev->config.evergreen.max_pipes = 2; 3253 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 2; 3254 1.1 riastrad rdev->config.evergreen.max_simds = 2; 3255 1.1 riastrad rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; 3256 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3257 1.1 riastrad rdev->config.evergreen.max_threads = 192; 3258 1.1 riastrad rdev->config.evergreen.max_gs_threads = 16; 3259 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3260 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3261 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 128; 3262 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 32; 3263 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 96; 3264 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 4; 3265 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 1; 3266 1.1 riastrad 3267 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x40; 3268 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3269 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3270 1.1 riastrad gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN; 3271 1.1 riastrad break; 3272 1.1 riastrad case CHIP_SUMO: 3273 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3274 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3275 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 4; 3276 1.1 riastrad if (rdev->pdev->device == 0x9648) 3277 1.1 riastrad rdev->config.evergreen.max_simds = 3; 3278 1.1 riastrad else if ((rdev->pdev->device == 0x9647) || 3279 1.1 riastrad (rdev->pdev->device == 0x964a)) 3280 1.1 riastrad rdev->config.evergreen.max_simds = 4; 3281 1.1 riastrad else 3282 1.1 riastrad rdev->config.evergreen.max_simds = 5; 3283 1.1 riastrad rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; 3284 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3285 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3286 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3287 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3288 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3289 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3290 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3291 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3292 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3293 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3294 1.1 riastrad 3295 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x40; 3296 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3297 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3298 1.1 riastrad gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN; 3299 1.1 riastrad break; 3300 1.1 riastrad case CHIP_SUMO2: 3301 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3302 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3303 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 4; 3304 1.1 riastrad rdev->config.evergreen.max_simds = 2; 3305 1.1 riastrad rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; 3306 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3307 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3308 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3309 1.1 riastrad rdev->config.evergreen.max_stack_entries = 512; 3310 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3311 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3312 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3313 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3314 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 4; 3315 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3316 1.1 riastrad 3317 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x40; 3318 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3319 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3320 1.1 riastrad gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN; 3321 1.1 riastrad break; 3322 1.1 riastrad case CHIP_BARTS: 3323 1.1 riastrad rdev->config.evergreen.num_ses = 2; 3324 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3325 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 8; 3326 1.1 riastrad rdev->config.evergreen.max_simds = 7; 3327 1.1 riastrad rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses; 3328 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3329 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3330 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3331 1.1 riastrad rdev->config.evergreen.max_stack_entries = 512; 3332 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3333 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3334 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3335 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3336 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3337 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3338 1.1 riastrad 3339 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x100; 3340 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3341 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3342 1.1 riastrad gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN; 3343 1.1 riastrad break; 3344 1.1 riastrad case CHIP_TURKS: 3345 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3346 1.1 riastrad rdev->config.evergreen.max_pipes = 4; 3347 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 4; 3348 1.1 riastrad rdev->config.evergreen.max_simds = 6; 3349 1.1 riastrad rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; 3350 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3351 1.1 riastrad rdev->config.evergreen.max_threads = 248; 3352 1.1 riastrad rdev->config.evergreen.max_gs_threads = 32; 3353 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3354 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3355 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 256; 3356 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 64; 3357 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 192; 3358 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 8; 3359 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 2; 3360 1.1 riastrad 3361 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x100; 3362 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3363 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3364 1.1 riastrad gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN; 3365 1.1 riastrad break; 3366 1.1 riastrad case CHIP_CAICOS: 3367 1.1 riastrad rdev->config.evergreen.num_ses = 1; 3368 1.1 riastrad rdev->config.evergreen.max_pipes = 2; 3369 1.1 riastrad rdev->config.evergreen.max_tile_pipes = 2; 3370 1.1 riastrad rdev->config.evergreen.max_simds = 2; 3371 1.1 riastrad rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; 3372 1.1 riastrad rdev->config.evergreen.max_gprs = 256; 3373 1.1 riastrad rdev->config.evergreen.max_threads = 192; 3374 1.1 riastrad rdev->config.evergreen.max_gs_threads = 16; 3375 1.1 riastrad rdev->config.evergreen.max_stack_entries = 256; 3376 1.1 riastrad rdev->config.evergreen.sx_num_of_sets = 4; 3377 1.1 riastrad rdev->config.evergreen.sx_max_export_size = 128; 3378 1.1 riastrad rdev->config.evergreen.sx_max_export_pos_size = 32; 3379 1.1 riastrad rdev->config.evergreen.sx_max_export_smx_size = 96; 3380 1.1 riastrad rdev->config.evergreen.max_hw_contexts = 4; 3381 1.1 riastrad rdev->config.evergreen.sq_num_cf_insts = 1; 3382 1.1 riastrad 3383 1.1 riastrad rdev->config.evergreen.sc_prim_fifo_size = 0x40; 3384 1.1 riastrad rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 3385 1.1 riastrad rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 3386 1.1 riastrad gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN; 3387 1.1 riastrad break; 3388 1.1 riastrad } 3389 1.1 riastrad 3390 1.1 riastrad /* Initialize HDP */ 3391 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 3392 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 3393 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 3394 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 3395 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 3396 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 3397 1.1 riastrad } 3398 1.1 riastrad 3399 1.1 riastrad WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 3400 1.1 riastrad WREG32(SRBM_INT_CNTL, 0x1); 3401 1.1 riastrad WREG32(SRBM_INT_ACK, 0x1); 3402 1.1 riastrad 3403 1.1 riastrad evergreen_fix_pci_max_read_req_size(rdev); 3404 1.1 riastrad 3405 1.1 riastrad mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 3406 1.1 riastrad if ((rdev->family == CHIP_PALM) || 3407 1.1 riastrad (rdev->family == CHIP_SUMO) || 3408 1.1 riastrad (rdev->family == CHIP_SUMO2)) 3409 1.1 riastrad mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG); 3410 1.1 riastrad else 3411 1.1 riastrad mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 3412 1.1 riastrad 3413 1.1 riastrad /* setup tiling info dword. gb_addr_config is not adequate since it does 3414 1.1 riastrad * not have bank info, so create a custom tiling dword. 3415 1.1 riastrad * bits 3:0 num_pipes 3416 1.1 riastrad * bits 7:4 num_banks 3417 1.1 riastrad * bits 11:8 group_size 3418 1.1 riastrad * bits 15:12 row_size 3419 1.1 riastrad */ 3420 1.1 riastrad rdev->config.evergreen.tile_config = 0; 3421 1.1 riastrad switch (rdev->config.evergreen.max_tile_pipes) { 3422 1.1 riastrad case 1: 3423 1.1 riastrad default: 3424 1.1 riastrad rdev->config.evergreen.tile_config |= (0 << 0); 3425 1.1 riastrad break; 3426 1.1 riastrad case 2: 3427 1.1 riastrad rdev->config.evergreen.tile_config |= (1 << 0); 3428 1.1 riastrad break; 3429 1.1 riastrad case 4: 3430 1.1 riastrad rdev->config.evergreen.tile_config |= (2 << 0); 3431 1.1 riastrad break; 3432 1.1 riastrad case 8: 3433 1.1 riastrad rdev->config.evergreen.tile_config |= (3 << 0); 3434 1.1 riastrad break; 3435 1.1 riastrad } 3436 1.1 riastrad /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ 3437 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 3438 1.1 riastrad rdev->config.evergreen.tile_config |= 1 << 4; 3439 1.1 riastrad else { 3440 1.1 riastrad switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { 3441 1.1 riastrad case 0: /* four banks */ 3442 1.1 riastrad rdev->config.evergreen.tile_config |= 0 << 4; 3443 1.1 riastrad break; 3444 1.1 riastrad case 1: /* eight banks */ 3445 1.1 riastrad rdev->config.evergreen.tile_config |= 1 << 4; 3446 1.1 riastrad break; 3447 1.1 riastrad case 2: /* sixteen banks */ 3448 1.1 riastrad default: 3449 1.1 riastrad rdev->config.evergreen.tile_config |= 2 << 4; 3450 1.1 riastrad break; 3451 1.1 riastrad } 3452 1.1 riastrad } 3453 1.1 riastrad rdev->config.evergreen.tile_config |= 0 << 8; 3454 1.1 riastrad rdev->config.evergreen.tile_config |= 3455 1.1 riastrad ((gb_addr_config & 0x30000000) >> 28) << 12; 3456 1.1 riastrad 3457 1.1 riastrad if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { 3458 1.1 riastrad u32 efuse_straps_4; 3459 1.1 riastrad u32 efuse_straps_3; 3460 1.1 riastrad 3461 1.1 riastrad efuse_straps_4 = RREG32_RCU(0x204); 3462 1.1 riastrad efuse_straps_3 = RREG32_RCU(0x203); 3463 1.1 riastrad tmp = (((efuse_straps_4 & 0xf) << 4) | 3464 1.1 riastrad ((efuse_straps_3 & 0xf0000000) >> 28)); 3465 1.1 riastrad } else { 3466 1.1 riastrad tmp = 0; 3467 1.1 riastrad for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) { 3468 1.1 riastrad u32 rb_disable_bitmap; 3469 1.1 riastrad 3470 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 3471 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 3472 1.1 riastrad rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; 3473 1.1 riastrad tmp <<= 4; 3474 1.1 riastrad tmp |= rb_disable_bitmap; 3475 1.1 riastrad } 3476 1.1 riastrad } 3477 1.1 riastrad /* enabled rb are just the one not disabled :) */ 3478 1.1 riastrad disabled_rb_mask = tmp; 3479 1.1 riastrad tmp = 0; 3480 1.1 riastrad for (i = 0; i < rdev->config.evergreen.max_backends; i++) 3481 1.1 riastrad tmp |= (1 << i); 3482 1.1 riastrad /* if all the backends are disabled, fix it up here */ 3483 1.1 riastrad if ((disabled_rb_mask & tmp) == tmp) { 3484 1.1 riastrad for (i = 0; i < rdev->config.evergreen.max_backends; i++) 3485 1.1 riastrad disabled_rb_mask &= ~(1 << i); 3486 1.1 riastrad } 3487 1.1 riastrad 3488 1.1 riastrad for (i = 0; i < rdev->config.evergreen.num_ses; i++) { 3489 1.1 riastrad u32 simd_disable_bitmap; 3490 1.1 riastrad 3491 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 3492 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 3493 1.1 riastrad simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; 3494 1.1 riastrad simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds; 3495 1.1 riastrad tmp <<= 16; 3496 1.1 riastrad tmp |= simd_disable_bitmap; 3497 1.1 riastrad } 3498 1.1 riastrad rdev->config.evergreen.active_simds = hweight32(~tmp); 3499 1.1 riastrad 3500 1.1 riastrad WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3501 1.1 riastrad WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3502 1.1 riastrad 3503 1.1 riastrad WREG32(GB_ADDR_CONFIG, gb_addr_config); 3504 1.1 riastrad WREG32(DMIF_ADDR_CONFIG, gb_addr_config); 3505 1.1 riastrad WREG32(HDP_ADDR_CONFIG, gb_addr_config); 3506 1.1 riastrad WREG32(DMA_TILING_CONFIG, gb_addr_config); 3507 1.1 riastrad WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config); 3508 1.1 riastrad WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config); 3509 1.1 riastrad WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config); 3510 1.1 riastrad 3511 1.1 riastrad if ((rdev->config.evergreen.max_backends == 1) && 3512 1.1 riastrad (rdev->flags & RADEON_IS_IGP)) { 3513 1.1 riastrad if ((disabled_rb_mask & 3) == 1) { 3514 1.1 riastrad /* RB0 disabled, RB1 enabled */ 3515 1.1 riastrad tmp = 0x11111111; 3516 1.1 riastrad } else { 3517 1.1 riastrad /* RB1 disabled, RB0 enabled */ 3518 1.1 riastrad tmp = 0x00000000; 3519 1.1 riastrad } 3520 1.1 riastrad } else { 3521 1.1 riastrad tmp = gb_addr_config & NUM_PIPES_MASK; 3522 1.1 riastrad tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends, 3523 1.1 riastrad EVERGREEN_MAX_BACKENDS, disabled_rb_mask); 3524 1.1 riastrad } 3525 1.5 riastrad rdev->config.evergreen.backend_map = tmp; 3526 1.1 riastrad WREG32(GB_BACKEND_MAP, tmp); 3527 1.1 riastrad 3528 1.1 riastrad WREG32(CGTS_SYS_TCC_DISABLE, 0); 3529 1.1 riastrad WREG32(CGTS_TCC_DISABLE, 0); 3530 1.1 riastrad WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); 3531 1.1 riastrad WREG32(CGTS_USER_TCC_DISABLE, 0); 3532 1.1 riastrad 3533 1.1 riastrad /* set HW defaults for 3D engine */ 3534 1.1 riastrad WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | 3535 1.1 riastrad ROQ_IB2_START(0x2b))); 3536 1.1 riastrad 3537 1.1 riastrad WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); 3538 1.1 riastrad 3539 1.1 riastrad WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | 3540 1.1 riastrad SYNC_GRADIENT | 3541 1.1 riastrad SYNC_WALKER | 3542 1.1 riastrad SYNC_ALIGNER)); 3543 1.1 riastrad 3544 1.1 riastrad sx_debug_1 = RREG32(SX_DEBUG_1); 3545 1.1 riastrad sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 3546 1.1 riastrad WREG32(SX_DEBUG_1, sx_debug_1); 3547 1.1 riastrad 3548 1.1 riastrad 3549 1.1 riastrad smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 3550 1.1 riastrad smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff); 3551 1.1 riastrad smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets); 3552 1.1 riastrad WREG32(SMX_DC_CTL0, smx_dc_ctl0); 3553 1.1 riastrad 3554 1.1 riastrad if (rdev->family <= CHIP_SUMO2) 3555 1.1 riastrad WREG32(SMX_SAR_CTL0, 0x00010000); 3556 1.1 riastrad 3557 1.1 riastrad WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) | 3558 1.1 riastrad POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) | 3559 1.1 riastrad SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1))); 3560 1.1 riastrad 3561 1.1 riastrad WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) | 3562 1.1 riastrad SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) | 3563 1.1 riastrad SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size))); 3564 1.1 riastrad 3565 1.1 riastrad WREG32(VGT_NUM_INSTANCES, 1); 3566 1.1 riastrad WREG32(SPI_CONFIG_CNTL, 0); 3567 1.1 riastrad WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4)); 3568 1.1 riastrad WREG32(CP_PERFMON_CNTL, 0); 3569 1.1 riastrad 3570 1.1 riastrad WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) | 3571 1.1 riastrad FETCH_FIFO_HIWATER(0x4) | 3572 1.1 riastrad DONE_FIFO_HIWATER(0xe0) | 3573 1.1 riastrad ALU_UPDATE_FIFO_HIWATER(0x8))); 3574 1.1 riastrad 3575 1.1 riastrad sq_config = RREG32(SQ_CONFIG); 3576 1.1 riastrad sq_config &= ~(PS_PRIO(3) | 3577 1.1 riastrad VS_PRIO(3) | 3578 1.1 riastrad GS_PRIO(3) | 3579 1.1 riastrad ES_PRIO(3)); 3580 1.1 riastrad sq_config |= (VC_ENABLE | 3581 1.1 riastrad EXPORT_SRC_C | 3582 1.1 riastrad PS_PRIO(0) | 3583 1.1 riastrad VS_PRIO(1) | 3584 1.1 riastrad GS_PRIO(2) | 3585 1.1 riastrad ES_PRIO(3)); 3586 1.1 riastrad 3587 1.1 riastrad switch (rdev->family) { 3588 1.1 riastrad case CHIP_CEDAR: 3589 1.1 riastrad case CHIP_PALM: 3590 1.1 riastrad case CHIP_SUMO: 3591 1.1 riastrad case CHIP_SUMO2: 3592 1.1 riastrad case CHIP_CAICOS: 3593 1.1 riastrad /* no vertex cache */ 3594 1.1 riastrad sq_config &= ~VC_ENABLE; 3595 1.1 riastrad break; 3596 1.1 riastrad default: 3597 1.1 riastrad break; 3598 1.1 riastrad } 3599 1.1 riastrad 3600 1.1 riastrad sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT); 3601 1.1 riastrad 3602 1.1 riastrad sq_gpr_resource_mgmt_1 = NUM_PS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2))* 12 / 32); 3603 1.1 riastrad sq_gpr_resource_mgmt_1 |= NUM_VS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 6 / 32); 3604 1.1 riastrad sq_gpr_resource_mgmt_1 |= NUM_CLAUSE_TEMP_GPRS(4); 3605 1.1 riastrad sq_gpr_resource_mgmt_2 = NUM_GS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32); 3606 1.1 riastrad sq_gpr_resource_mgmt_2 |= NUM_ES_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32); 3607 1.1 riastrad sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); 3608 1.1 riastrad sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); 3609 1.1 riastrad 3610 1.1 riastrad switch (rdev->family) { 3611 1.1 riastrad case CHIP_CEDAR: 3612 1.1 riastrad case CHIP_PALM: 3613 1.1 riastrad case CHIP_SUMO: 3614 1.1 riastrad case CHIP_SUMO2: 3615 1.1 riastrad ps_thread_count = 96; 3616 1.1 riastrad break; 3617 1.1 riastrad default: 3618 1.1 riastrad ps_thread_count = 128; 3619 1.1 riastrad break; 3620 1.1 riastrad } 3621 1.1 riastrad 3622 1.1 riastrad sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); 3623 1.1 riastrad sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 3624 1.1 riastrad sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 3625 1.1 riastrad sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 3626 1.1 riastrad sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 3627 1.1 riastrad sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 3628 1.1 riastrad 3629 1.1 riastrad sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3630 1.1 riastrad sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3631 1.1 riastrad sq_stack_resource_mgmt_2 = NUM_GS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3632 1.1 riastrad sq_stack_resource_mgmt_2 |= NUM_ES_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3633 1.1 riastrad sq_stack_resource_mgmt_3 = NUM_HS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3634 1.1 riastrad sq_stack_resource_mgmt_3 |= NUM_LS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); 3635 1.1 riastrad 3636 1.1 riastrad WREG32(SQ_CONFIG, sq_config); 3637 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1); 3638 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2); 3639 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_3, sq_gpr_resource_mgmt_3); 3640 1.1 riastrad WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt); 3641 1.1 riastrad WREG32(SQ_THREAD_RESOURCE_MGMT_2, sq_thread_resource_mgmt_2); 3642 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1); 3643 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2); 3644 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_3, sq_stack_resource_mgmt_3); 3645 1.1 riastrad WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); 3646 1.1 riastrad WREG32(SQ_LDS_RESOURCE_MGMT, sq_lds_resource_mgmt); 3647 1.1 riastrad 3648 1.1 riastrad WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 3649 1.1 riastrad FORCE_EOV_MAX_REZ_CNT(255))); 3650 1.1 riastrad 3651 1.1 riastrad switch (rdev->family) { 3652 1.1 riastrad case CHIP_CEDAR: 3653 1.1 riastrad case CHIP_PALM: 3654 1.1 riastrad case CHIP_SUMO: 3655 1.1 riastrad case CHIP_SUMO2: 3656 1.1 riastrad case CHIP_CAICOS: 3657 1.1 riastrad vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); 3658 1.1 riastrad break; 3659 1.1 riastrad default: 3660 1.1 riastrad vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC); 3661 1.1 riastrad break; 3662 1.1 riastrad } 3663 1.1 riastrad vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO); 3664 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); 3665 1.1 riastrad 3666 1.1 riastrad WREG32(VGT_GS_VERTEX_REUSE, 16); 3667 1.1 riastrad WREG32(PA_SU_LINE_STIPPLE_VALUE, 0); 3668 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 3669 1.1 riastrad 3670 1.1 riastrad WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); 3671 1.1 riastrad WREG32(VGT_OUT_DEALLOC_CNTL, 16); 3672 1.1 riastrad 3673 1.1 riastrad WREG32(CB_PERF_CTR0_SEL_0, 0); 3674 1.1 riastrad WREG32(CB_PERF_CTR0_SEL_1, 0); 3675 1.1 riastrad WREG32(CB_PERF_CTR1_SEL_0, 0); 3676 1.1 riastrad WREG32(CB_PERF_CTR1_SEL_1, 0); 3677 1.1 riastrad WREG32(CB_PERF_CTR2_SEL_0, 0); 3678 1.1 riastrad WREG32(CB_PERF_CTR2_SEL_1, 0); 3679 1.1 riastrad WREG32(CB_PERF_CTR3_SEL_0, 0); 3680 1.1 riastrad WREG32(CB_PERF_CTR3_SEL_1, 0); 3681 1.1 riastrad 3682 1.1 riastrad /* clear render buffer base addresses */ 3683 1.1 riastrad WREG32(CB_COLOR0_BASE, 0); 3684 1.1 riastrad WREG32(CB_COLOR1_BASE, 0); 3685 1.1 riastrad WREG32(CB_COLOR2_BASE, 0); 3686 1.1 riastrad WREG32(CB_COLOR3_BASE, 0); 3687 1.1 riastrad WREG32(CB_COLOR4_BASE, 0); 3688 1.1 riastrad WREG32(CB_COLOR5_BASE, 0); 3689 1.1 riastrad WREG32(CB_COLOR6_BASE, 0); 3690 1.1 riastrad WREG32(CB_COLOR7_BASE, 0); 3691 1.1 riastrad WREG32(CB_COLOR8_BASE, 0); 3692 1.1 riastrad WREG32(CB_COLOR9_BASE, 0); 3693 1.1 riastrad WREG32(CB_COLOR10_BASE, 0); 3694 1.1 riastrad WREG32(CB_COLOR11_BASE, 0); 3695 1.1 riastrad 3696 1.1 riastrad /* set the shader const cache sizes to 0 */ 3697 1.1 riastrad for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4) 3698 1.1 riastrad WREG32(i, 0); 3699 1.1 riastrad for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4) 3700 1.1 riastrad WREG32(i, 0); 3701 1.1 riastrad 3702 1.1 riastrad tmp = RREG32(HDP_MISC_CNTL); 3703 1.1 riastrad tmp |= HDP_FLUSH_INVALIDATE_CACHE; 3704 1.1 riastrad WREG32(HDP_MISC_CNTL, tmp); 3705 1.1 riastrad 3706 1.1 riastrad hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 3707 1.1 riastrad WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 3708 1.1 riastrad 3709 1.1 riastrad WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3)); 3710 1.1 riastrad 3711 1.1 riastrad udelay(50); 3712 1.1 riastrad 3713 1.1 riastrad } 3714 1.1 riastrad 3715 1.1 riastrad int evergreen_mc_init(struct radeon_device *rdev) 3716 1.1 riastrad { 3717 1.1 riastrad u32 tmp; 3718 1.1 riastrad int chansize, numchan; 3719 1.1 riastrad 3720 1.1 riastrad /* Get VRAM informations */ 3721 1.1 riastrad rdev->mc.vram_is_ddr = true; 3722 1.1 riastrad if ((rdev->family == CHIP_PALM) || 3723 1.1 riastrad (rdev->family == CHIP_SUMO) || 3724 1.1 riastrad (rdev->family == CHIP_SUMO2)) 3725 1.1 riastrad tmp = RREG32(FUS_MC_ARB_RAMCFG); 3726 1.1 riastrad else 3727 1.1 riastrad tmp = RREG32(MC_ARB_RAMCFG); 3728 1.1 riastrad if (tmp & CHANSIZE_OVERRIDE) { 3729 1.1 riastrad chansize = 16; 3730 1.1 riastrad } else if (tmp & CHANSIZE_MASK) { 3731 1.1 riastrad chansize = 64; 3732 1.1 riastrad } else { 3733 1.1 riastrad chansize = 32; 3734 1.1 riastrad } 3735 1.1 riastrad tmp = RREG32(MC_SHARED_CHMAP); 3736 1.1 riastrad switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { 3737 1.1 riastrad case 0: 3738 1.1 riastrad default: 3739 1.1 riastrad numchan = 1; 3740 1.1 riastrad break; 3741 1.1 riastrad case 1: 3742 1.1 riastrad numchan = 2; 3743 1.1 riastrad break; 3744 1.1 riastrad case 2: 3745 1.1 riastrad numchan = 4; 3746 1.1 riastrad break; 3747 1.1 riastrad case 3: 3748 1.1 riastrad numchan = 8; 3749 1.1 riastrad break; 3750 1.1 riastrad } 3751 1.1 riastrad rdev->mc.vram_width = numchan * chansize; 3752 1.1 riastrad /* Could aper size report 0 ? */ 3753 1.1 riastrad rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 3754 1.1 riastrad rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 3755 1.1 riastrad /* Setup GPU memory space */ 3756 1.1 riastrad if ((rdev->family == CHIP_PALM) || 3757 1.1 riastrad (rdev->family == CHIP_SUMO) || 3758 1.1 riastrad (rdev->family == CHIP_SUMO2)) { 3759 1.1 riastrad /* size in bytes on fusion */ 3760 1.1 riastrad rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 3761 1.1 riastrad rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 3762 1.1 riastrad } else { 3763 1.1 riastrad /* size in MB on evergreen/cayman/tn */ 3764 1.1 riastrad rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; 3765 1.1 riastrad rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; 3766 1.1 riastrad } 3767 1.1 riastrad rdev->mc.visible_vram_size = rdev->mc.aper_size; 3768 1.1 riastrad r700_vram_gtt_location(rdev, &rdev->mc); 3769 1.1 riastrad radeon_update_bandwidth_info(rdev); 3770 1.1 riastrad 3771 1.1 riastrad return 0; 3772 1.1 riastrad } 3773 1.1 riastrad 3774 1.1 riastrad void evergreen_print_gpu_status_regs(struct radeon_device *rdev) 3775 1.1 riastrad { 3776 1.1 riastrad dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 3777 1.1 riastrad RREG32(GRBM_STATUS)); 3778 1.1 riastrad dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 3779 1.1 riastrad RREG32(GRBM_STATUS_SE0)); 3780 1.1 riastrad dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 3781 1.1 riastrad RREG32(GRBM_STATUS_SE1)); 3782 1.1 riastrad dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 3783 1.1 riastrad RREG32(SRBM_STATUS)); 3784 1.1 riastrad dev_info(rdev->dev, " SRBM_STATUS2 = 0x%08X\n", 3785 1.1 riastrad RREG32(SRBM_STATUS2)); 3786 1.1 riastrad dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 3787 1.1 riastrad RREG32(CP_STALLED_STAT1)); 3788 1.1 riastrad dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 3789 1.1 riastrad RREG32(CP_STALLED_STAT2)); 3790 1.1 riastrad dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 3791 1.1 riastrad RREG32(CP_BUSY_STAT)); 3792 1.1 riastrad dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 3793 1.1 riastrad RREG32(CP_STAT)); 3794 1.1 riastrad dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 3795 1.1 riastrad RREG32(DMA_STATUS_REG)); 3796 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 3797 1.1 riastrad dev_info(rdev->dev, " R_00D834_DMA_STATUS_REG = 0x%08X\n", 3798 1.1 riastrad RREG32(DMA_STATUS_REG + 0x800)); 3799 1.1 riastrad } 3800 1.1 riastrad } 3801 1.1 riastrad 3802 1.1 riastrad bool evergreen_is_display_hung(struct radeon_device *rdev) 3803 1.1 riastrad { 3804 1.1 riastrad u32 crtc_hung = 0; 3805 1.1 riastrad u32 crtc_status[6]; 3806 1.1 riastrad u32 i, j, tmp; 3807 1.1 riastrad 3808 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 3809 1.1 riastrad if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) { 3810 1.1 riastrad crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 3811 1.1 riastrad crtc_hung |= (1 << i); 3812 1.1 riastrad } 3813 1.1 riastrad } 3814 1.1 riastrad 3815 1.1 riastrad for (j = 0; j < 10; j++) { 3816 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 3817 1.1 riastrad if (crtc_hung & (1 << i)) { 3818 1.1 riastrad tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 3819 1.1 riastrad if (tmp != crtc_status[i]) 3820 1.1 riastrad crtc_hung &= ~(1 << i); 3821 1.1 riastrad } 3822 1.1 riastrad } 3823 1.1 riastrad if (crtc_hung == 0) 3824 1.1 riastrad return false; 3825 1.1 riastrad udelay(100); 3826 1.1 riastrad } 3827 1.1 riastrad 3828 1.1 riastrad return true; 3829 1.1 riastrad } 3830 1.1 riastrad 3831 1.1 riastrad u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev) 3832 1.1 riastrad { 3833 1.1 riastrad u32 reset_mask = 0; 3834 1.1 riastrad u32 tmp; 3835 1.1 riastrad 3836 1.1 riastrad /* GRBM_STATUS */ 3837 1.1 riastrad tmp = RREG32(GRBM_STATUS); 3838 1.1 riastrad if (tmp & (PA_BUSY | SC_BUSY | 3839 1.1 riastrad SH_BUSY | SX_BUSY | 3840 1.1 riastrad TA_BUSY | VGT_BUSY | 3841 1.1 riastrad DB_BUSY | CB_BUSY | 3842 1.1 riastrad SPI_BUSY | VGT_BUSY_NO_DMA)) 3843 1.1 riastrad reset_mask |= RADEON_RESET_GFX; 3844 1.1 riastrad 3845 1.1 riastrad if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 3846 1.1 riastrad CP_BUSY | CP_COHERENCY_BUSY)) 3847 1.1 riastrad reset_mask |= RADEON_RESET_CP; 3848 1.1 riastrad 3849 1.1 riastrad if (tmp & GRBM_EE_BUSY) 3850 1.1 riastrad reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 3851 1.1 riastrad 3852 1.1 riastrad /* DMA_STATUS_REG */ 3853 1.1 riastrad tmp = RREG32(DMA_STATUS_REG); 3854 1.1 riastrad if (!(tmp & DMA_IDLE)) 3855 1.1 riastrad reset_mask |= RADEON_RESET_DMA; 3856 1.1 riastrad 3857 1.1 riastrad /* SRBM_STATUS2 */ 3858 1.1 riastrad tmp = RREG32(SRBM_STATUS2); 3859 1.1 riastrad if (tmp & DMA_BUSY) 3860 1.1 riastrad reset_mask |= RADEON_RESET_DMA; 3861 1.1 riastrad 3862 1.1 riastrad /* SRBM_STATUS */ 3863 1.1 riastrad tmp = RREG32(SRBM_STATUS); 3864 1.1 riastrad if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 3865 1.1 riastrad reset_mask |= RADEON_RESET_RLC; 3866 1.1 riastrad 3867 1.1 riastrad if (tmp & IH_BUSY) 3868 1.1 riastrad reset_mask |= RADEON_RESET_IH; 3869 1.1 riastrad 3870 1.1 riastrad if (tmp & SEM_BUSY) 3871 1.1 riastrad reset_mask |= RADEON_RESET_SEM; 3872 1.1 riastrad 3873 1.1 riastrad if (tmp & GRBM_RQ_PENDING) 3874 1.1 riastrad reset_mask |= RADEON_RESET_GRBM; 3875 1.1 riastrad 3876 1.1 riastrad if (tmp & VMC_BUSY) 3877 1.1 riastrad reset_mask |= RADEON_RESET_VMC; 3878 1.1 riastrad 3879 1.1 riastrad if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 3880 1.1 riastrad MCC_BUSY | MCD_BUSY)) 3881 1.1 riastrad reset_mask |= RADEON_RESET_MC; 3882 1.1 riastrad 3883 1.1 riastrad if (evergreen_is_display_hung(rdev)) 3884 1.1 riastrad reset_mask |= RADEON_RESET_DISPLAY; 3885 1.1 riastrad 3886 1.1 riastrad /* VM_L2_STATUS */ 3887 1.1 riastrad tmp = RREG32(VM_L2_STATUS); 3888 1.1 riastrad if (tmp & L2_BUSY) 3889 1.1 riastrad reset_mask |= RADEON_RESET_VMC; 3890 1.1 riastrad 3891 1.1 riastrad /* Skip MC reset as it's mostly likely not hung, just busy */ 3892 1.1 riastrad if (reset_mask & RADEON_RESET_MC) { 3893 1.1 riastrad DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask); 3894 1.1 riastrad reset_mask &= ~RADEON_RESET_MC; 3895 1.1 riastrad } 3896 1.1 riastrad 3897 1.1 riastrad return reset_mask; 3898 1.1 riastrad } 3899 1.1 riastrad 3900 1.1 riastrad static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 3901 1.1 riastrad { 3902 1.1 riastrad struct evergreen_mc_save save; 3903 1.1 riastrad u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 3904 1.1 riastrad u32 tmp; 3905 1.1 riastrad 3906 1.1 riastrad if (reset_mask == 0) 3907 1.1 riastrad return; 3908 1.1 riastrad 3909 1.1 riastrad dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 3910 1.1 riastrad 3911 1.1 riastrad evergreen_print_gpu_status_regs(rdev); 3912 1.1 riastrad 3913 1.1 riastrad /* Disable CP parsing/prefetching */ 3914 1.1 riastrad WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 3915 1.1 riastrad 3916 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) { 3917 1.1 riastrad /* Disable DMA */ 3918 1.1 riastrad tmp = RREG32(DMA_RB_CNTL); 3919 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 3920 1.1 riastrad WREG32(DMA_RB_CNTL, tmp); 3921 1.1 riastrad } 3922 1.1 riastrad 3923 1.1 riastrad udelay(50); 3924 1.1 riastrad 3925 1.1 riastrad evergreen_mc_stop(rdev, &save); 3926 1.1 riastrad if (evergreen_mc_wait_for_idle(rdev)) { 3927 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 3928 1.1 riastrad } 3929 1.1 riastrad 3930 1.1 riastrad if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 3931 1.1 riastrad grbm_soft_reset |= SOFT_RESET_DB | 3932 1.1 riastrad SOFT_RESET_CB | 3933 1.1 riastrad SOFT_RESET_PA | 3934 1.1 riastrad SOFT_RESET_SC | 3935 1.1 riastrad SOFT_RESET_SPI | 3936 1.1 riastrad SOFT_RESET_SX | 3937 1.1 riastrad SOFT_RESET_SH | 3938 1.1 riastrad SOFT_RESET_TC | 3939 1.1 riastrad SOFT_RESET_TA | 3940 1.1 riastrad SOFT_RESET_VC | 3941 1.1 riastrad SOFT_RESET_VGT; 3942 1.1 riastrad } 3943 1.1 riastrad 3944 1.1 riastrad if (reset_mask & RADEON_RESET_CP) { 3945 1.1 riastrad grbm_soft_reset |= SOFT_RESET_CP | 3946 1.1 riastrad SOFT_RESET_VGT; 3947 1.1 riastrad 3948 1.1 riastrad srbm_soft_reset |= SOFT_RESET_GRBM; 3949 1.1 riastrad } 3950 1.1 riastrad 3951 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) 3952 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DMA; 3953 1.1 riastrad 3954 1.1 riastrad if (reset_mask & RADEON_RESET_DISPLAY) 3955 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DC; 3956 1.1 riastrad 3957 1.1 riastrad if (reset_mask & RADEON_RESET_RLC) 3958 1.1 riastrad srbm_soft_reset |= SOFT_RESET_RLC; 3959 1.1 riastrad 3960 1.1 riastrad if (reset_mask & RADEON_RESET_SEM) 3961 1.1 riastrad srbm_soft_reset |= SOFT_RESET_SEM; 3962 1.1 riastrad 3963 1.1 riastrad if (reset_mask & RADEON_RESET_IH) 3964 1.1 riastrad srbm_soft_reset |= SOFT_RESET_IH; 3965 1.1 riastrad 3966 1.1 riastrad if (reset_mask & RADEON_RESET_GRBM) 3967 1.1 riastrad srbm_soft_reset |= SOFT_RESET_GRBM; 3968 1.1 riastrad 3969 1.1 riastrad if (reset_mask & RADEON_RESET_VMC) 3970 1.1 riastrad srbm_soft_reset |= SOFT_RESET_VMC; 3971 1.1 riastrad 3972 1.1 riastrad if (!(rdev->flags & RADEON_IS_IGP)) { 3973 1.1 riastrad if (reset_mask & RADEON_RESET_MC) 3974 1.1 riastrad srbm_soft_reset |= SOFT_RESET_MC; 3975 1.1 riastrad } 3976 1.1 riastrad 3977 1.1 riastrad if (grbm_soft_reset) { 3978 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 3979 1.1 riastrad tmp |= grbm_soft_reset; 3980 1.1 riastrad dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 3981 1.1 riastrad WREG32(GRBM_SOFT_RESET, tmp); 3982 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 3983 1.1 riastrad 3984 1.1 riastrad udelay(50); 3985 1.1 riastrad 3986 1.1 riastrad tmp &= ~grbm_soft_reset; 3987 1.1 riastrad WREG32(GRBM_SOFT_RESET, tmp); 3988 1.1 riastrad tmp = RREG32(GRBM_SOFT_RESET); 3989 1.1 riastrad } 3990 1.1 riastrad 3991 1.1 riastrad if (srbm_soft_reset) { 3992 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 3993 1.1 riastrad tmp |= srbm_soft_reset; 3994 1.1 riastrad dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 3995 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 3996 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 3997 1.1 riastrad 3998 1.1 riastrad udelay(50); 3999 1.1 riastrad 4000 1.1 riastrad tmp &= ~srbm_soft_reset; 4001 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 4002 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 4003 1.1 riastrad } 4004 1.1 riastrad 4005 1.1 riastrad /* Wait a little for things to settle down */ 4006 1.1 riastrad udelay(50); 4007 1.1 riastrad 4008 1.1 riastrad evergreen_mc_resume(rdev, &save); 4009 1.1 riastrad udelay(50); 4010 1.1 riastrad 4011 1.1 riastrad evergreen_print_gpu_status_regs(rdev); 4012 1.1 riastrad } 4013 1.1 riastrad 4014 1.1 riastrad void evergreen_gpu_pci_config_reset(struct radeon_device *rdev) 4015 1.1 riastrad { 4016 1.1 riastrad struct evergreen_mc_save save; 4017 1.1 riastrad u32 tmp, i; 4018 1.1 riastrad 4019 1.1 riastrad dev_info(rdev->dev, "GPU pci config reset\n"); 4020 1.1 riastrad 4021 1.1 riastrad /* disable dpm? */ 4022 1.1 riastrad 4023 1.1 riastrad /* Disable CP parsing/prefetching */ 4024 1.1 riastrad WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 4025 1.1 riastrad udelay(50); 4026 1.1 riastrad /* Disable DMA */ 4027 1.1 riastrad tmp = RREG32(DMA_RB_CNTL); 4028 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 4029 1.1 riastrad WREG32(DMA_RB_CNTL, tmp); 4030 1.1 riastrad /* XXX other engines? */ 4031 1.1 riastrad 4032 1.1 riastrad /* halt the rlc */ 4033 1.1 riastrad r600_rlc_stop(rdev); 4034 1.1 riastrad 4035 1.1 riastrad udelay(50); 4036 1.1 riastrad 4037 1.1 riastrad /* set mclk/sclk to bypass */ 4038 1.1 riastrad rv770_set_clk_bypass_mode(rdev); 4039 1.1 riastrad /* disable BM */ 4040 1.1 riastrad pci_clear_master(rdev->pdev); 4041 1.1 riastrad /* disable mem access */ 4042 1.1 riastrad evergreen_mc_stop(rdev, &save); 4043 1.1 riastrad if (evergreen_mc_wait_for_idle(rdev)) { 4044 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timed out !\n"); 4045 1.1 riastrad } 4046 1.1 riastrad /* reset */ 4047 1.1 riastrad radeon_pci_config_reset(rdev); 4048 1.1 riastrad /* wait for asic to come out of reset */ 4049 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 4050 1.1 riastrad if (RREG32(CONFIG_MEMSIZE) != 0xffffffff) 4051 1.1 riastrad break; 4052 1.1 riastrad udelay(1); 4053 1.1 riastrad } 4054 1.1 riastrad } 4055 1.1 riastrad 4056 1.5 riastrad int evergreen_asic_reset(struct radeon_device *rdev, bool hard) 4057 1.1 riastrad { 4058 1.1 riastrad u32 reset_mask; 4059 1.1 riastrad 4060 1.5 riastrad if (hard) { 4061 1.5 riastrad evergreen_gpu_pci_config_reset(rdev); 4062 1.5 riastrad return 0; 4063 1.5 riastrad } 4064 1.5 riastrad 4065 1.1 riastrad reset_mask = evergreen_gpu_check_soft_reset(rdev); 4066 1.1 riastrad 4067 1.1 riastrad if (reset_mask) 4068 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, true); 4069 1.1 riastrad 4070 1.1 riastrad /* try soft reset */ 4071 1.1 riastrad evergreen_gpu_soft_reset(rdev, reset_mask); 4072 1.1 riastrad 4073 1.1 riastrad reset_mask = evergreen_gpu_check_soft_reset(rdev); 4074 1.1 riastrad 4075 1.1 riastrad /* try pci config reset */ 4076 1.1 riastrad if (reset_mask && radeon_hard_reset) 4077 1.1 riastrad evergreen_gpu_pci_config_reset(rdev); 4078 1.1 riastrad 4079 1.1 riastrad reset_mask = evergreen_gpu_check_soft_reset(rdev); 4080 1.1 riastrad 4081 1.1 riastrad if (!reset_mask) 4082 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, false); 4083 1.1 riastrad 4084 1.1 riastrad return 0; 4085 1.1 riastrad } 4086 1.1 riastrad 4087 1.1 riastrad /** 4088 1.1 riastrad * evergreen_gfx_is_lockup - Check if the GFX engine is locked up 4089 1.1 riastrad * 4090 1.1 riastrad * @rdev: radeon_device pointer 4091 1.1 riastrad * @ring: radeon_ring structure holding ring information 4092 1.1 riastrad * 4093 1.1 riastrad * Check if the GFX engine is locked up. 4094 1.1 riastrad * Returns true if the engine appears to be locked up, false if not. 4095 1.1 riastrad */ 4096 1.1 riastrad bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 4097 1.1 riastrad { 4098 1.1 riastrad u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); 4099 1.1 riastrad 4100 1.1 riastrad if (!(reset_mask & (RADEON_RESET_GFX | 4101 1.1 riastrad RADEON_RESET_COMPUTE | 4102 1.1 riastrad RADEON_RESET_CP))) { 4103 1.1 riastrad radeon_ring_lockup_update(rdev, ring); 4104 1.1 riastrad return false; 4105 1.1 riastrad } 4106 1.1 riastrad return radeon_ring_test_lockup(rdev, ring); 4107 1.1 riastrad } 4108 1.1 riastrad 4109 1.1 riastrad /* 4110 1.1 riastrad * RLC 4111 1.1 riastrad */ 4112 1.1 riastrad #define RLC_SAVE_RESTORE_LIST_END_MARKER 0x00000000 4113 1.1 riastrad #define RLC_CLEAR_STATE_END_MARKER 0x00000001 4114 1.1 riastrad 4115 1.1 riastrad void sumo_rlc_fini(struct radeon_device *rdev) 4116 1.1 riastrad { 4117 1.1 riastrad int r; 4118 1.1 riastrad 4119 1.1 riastrad /* save restore block */ 4120 1.1 riastrad if (rdev->rlc.save_restore_obj) { 4121 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 4122 1.1 riastrad if (unlikely(r != 0)) 4123 1.1 riastrad dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r); 4124 1.1 riastrad radeon_bo_unpin(rdev->rlc.save_restore_obj); 4125 1.1 riastrad radeon_bo_unreserve(rdev->rlc.save_restore_obj); 4126 1.1 riastrad 4127 1.1 riastrad radeon_bo_unref(&rdev->rlc.save_restore_obj); 4128 1.1 riastrad rdev->rlc.save_restore_obj = NULL; 4129 1.1 riastrad } 4130 1.1 riastrad 4131 1.1 riastrad /* clear state block */ 4132 1.1 riastrad if (rdev->rlc.clear_state_obj) { 4133 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 4134 1.1 riastrad if (unlikely(r != 0)) 4135 1.1 riastrad dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r); 4136 1.1 riastrad radeon_bo_unpin(rdev->rlc.clear_state_obj); 4137 1.1 riastrad radeon_bo_unreserve(rdev->rlc.clear_state_obj); 4138 1.1 riastrad 4139 1.1 riastrad radeon_bo_unref(&rdev->rlc.clear_state_obj); 4140 1.1 riastrad rdev->rlc.clear_state_obj = NULL; 4141 1.1 riastrad } 4142 1.1 riastrad 4143 1.1 riastrad /* clear state block */ 4144 1.1 riastrad if (rdev->rlc.cp_table_obj) { 4145 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false); 4146 1.1 riastrad if (unlikely(r != 0)) 4147 1.1 riastrad dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r); 4148 1.1 riastrad radeon_bo_unpin(rdev->rlc.cp_table_obj); 4149 1.1 riastrad radeon_bo_unreserve(rdev->rlc.cp_table_obj); 4150 1.1 riastrad 4151 1.1 riastrad radeon_bo_unref(&rdev->rlc.cp_table_obj); 4152 1.1 riastrad rdev->rlc.cp_table_obj = NULL; 4153 1.1 riastrad } 4154 1.1 riastrad } 4155 1.1 riastrad 4156 1.1 riastrad #define CP_ME_TABLE_SIZE 96 4157 1.1 riastrad 4158 1.1 riastrad int sumo_rlc_init(struct radeon_device *rdev) 4159 1.1 riastrad { 4160 1.1 riastrad const u32 *src_ptr; 4161 1.1 riastrad volatile u32 *dst_ptr; 4162 1.1 riastrad u32 dws, data, i, j, k, reg_num; 4163 1.1 riastrad u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0; 4164 1.1 riastrad u64 reg_list_mc_addr; 4165 1.1 riastrad const struct cs_section_def *cs_data; 4166 1.1 riastrad int r; 4167 1.1 riastrad 4168 1.1 riastrad src_ptr = rdev->rlc.reg_list; 4169 1.1 riastrad dws = rdev->rlc.reg_list_size; 4170 1.1 riastrad if (rdev->family >= CHIP_BONAIRE) { 4171 1.1 riastrad dws += (5 * 16) + 48 + 48 + 64; 4172 1.1 riastrad } 4173 1.1 riastrad cs_data = rdev->rlc.cs_data; 4174 1.1 riastrad 4175 1.1 riastrad if (src_ptr) { 4176 1.1 riastrad /* save restore block */ 4177 1.1 riastrad if (rdev->rlc.save_restore_obj == NULL) { 4178 1.1 riastrad r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 4179 1.1 riastrad RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4180 1.1 riastrad NULL, &rdev->rlc.save_restore_obj); 4181 1.1 riastrad if (r) { 4182 1.1 riastrad dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); 4183 1.1 riastrad return r; 4184 1.1 riastrad } 4185 1.1 riastrad } 4186 1.1 riastrad 4187 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 4188 1.1 riastrad if (unlikely(r != 0)) { 4189 1.1 riastrad sumo_rlc_fini(rdev); 4190 1.1 riastrad return r; 4191 1.1 riastrad } 4192 1.1 riastrad r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM, 4193 1.1 riastrad &rdev->rlc.save_restore_gpu_addr); 4194 1.1 riastrad if (r) { 4195 1.1 riastrad radeon_bo_unreserve(rdev->rlc.save_restore_obj); 4196 1.1 riastrad dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r); 4197 1.1 riastrad sumo_rlc_fini(rdev); 4198 1.1 riastrad return r; 4199 1.1 riastrad } 4200 1.1 riastrad 4201 1.1 riastrad r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)__UNVOLATILE(&rdev->rlc.sr_ptr)); 4202 1.1 riastrad if (r) { 4203 1.1 riastrad dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r); 4204 1.1 riastrad sumo_rlc_fini(rdev); 4205 1.1 riastrad return r; 4206 1.1 riastrad } 4207 1.1 riastrad /* write the sr buffer */ 4208 1.1 riastrad dst_ptr = rdev->rlc.sr_ptr; 4209 1.1 riastrad if (rdev->family >= CHIP_TAHITI) { 4210 1.1 riastrad /* SI */ 4211 1.1 riastrad for (i = 0; i < rdev->rlc.reg_list_size; i++) 4212 1.1 riastrad dst_ptr[i] = cpu_to_le32(src_ptr[i]); 4213 1.1 riastrad } else { 4214 1.1 riastrad /* ON/LN/TN */ 4215 1.1 riastrad /* format: 4216 1.1 riastrad * dw0: (reg2 << 16) | reg1 4217 1.1 riastrad * dw1: reg1 save space 4218 1.1 riastrad * dw2: reg2 save space 4219 1.1 riastrad */ 4220 1.1 riastrad for (i = 0; i < dws; i++) { 4221 1.1 riastrad data = src_ptr[i] >> 2; 4222 1.1 riastrad i++; 4223 1.1 riastrad if (i < dws) 4224 1.1 riastrad data |= (src_ptr[i] >> 2) << 16; 4225 1.1 riastrad j = (((i - 1) * 3) / 2); 4226 1.1 riastrad dst_ptr[j] = cpu_to_le32(data); 4227 1.1 riastrad } 4228 1.1 riastrad j = ((i * 3) / 2); 4229 1.1 riastrad dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER); 4230 1.1 riastrad } 4231 1.1 riastrad radeon_bo_kunmap(rdev->rlc.save_restore_obj); 4232 1.1 riastrad radeon_bo_unreserve(rdev->rlc.save_restore_obj); 4233 1.1 riastrad } 4234 1.1 riastrad 4235 1.1 riastrad if (cs_data) { 4236 1.1 riastrad /* clear state block */ 4237 1.1 riastrad if (rdev->family >= CHIP_BONAIRE) { 4238 1.1 riastrad rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev); 4239 1.1 riastrad } else if (rdev->family >= CHIP_TAHITI) { 4240 1.1 riastrad rdev->rlc.clear_state_size = si_get_csb_size(rdev); 4241 1.1 riastrad dws = rdev->rlc.clear_state_size + (256 / 4); 4242 1.1 riastrad } else { 4243 1.1 riastrad reg_list_num = 0; 4244 1.1 riastrad dws = 0; 4245 1.1 riastrad for (i = 0; cs_data[i].section != NULL; i++) { 4246 1.1 riastrad for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 4247 1.1 riastrad reg_list_num++; 4248 1.1 riastrad dws += cs_data[i].section[j].reg_count; 4249 1.1 riastrad } 4250 1.1 riastrad } 4251 1.1 riastrad reg_list_blk_index = (3 * reg_list_num + 2); 4252 1.1 riastrad dws += reg_list_blk_index; 4253 1.1 riastrad rdev->rlc.clear_state_size = dws; 4254 1.1 riastrad } 4255 1.1 riastrad 4256 1.1 riastrad if (rdev->rlc.clear_state_obj == NULL) { 4257 1.1 riastrad r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 4258 1.1 riastrad RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4259 1.1 riastrad NULL, &rdev->rlc.clear_state_obj); 4260 1.1 riastrad if (r) { 4261 1.1 riastrad dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); 4262 1.1 riastrad sumo_rlc_fini(rdev); 4263 1.1 riastrad return r; 4264 1.1 riastrad } 4265 1.1 riastrad } 4266 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 4267 1.1 riastrad if (unlikely(r != 0)) { 4268 1.1 riastrad sumo_rlc_fini(rdev); 4269 1.1 riastrad return r; 4270 1.1 riastrad } 4271 1.1 riastrad r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM, 4272 1.1 riastrad &rdev->rlc.clear_state_gpu_addr); 4273 1.1 riastrad if (r) { 4274 1.1 riastrad radeon_bo_unreserve(rdev->rlc.clear_state_obj); 4275 1.1 riastrad dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r); 4276 1.1 riastrad sumo_rlc_fini(rdev); 4277 1.1 riastrad return r; 4278 1.1 riastrad } 4279 1.1 riastrad 4280 1.1 riastrad r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)__UNVOLATILE(&rdev->rlc.cs_ptr)); 4281 1.1 riastrad if (r) { 4282 1.1 riastrad dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r); 4283 1.1 riastrad sumo_rlc_fini(rdev); 4284 1.1 riastrad return r; 4285 1.1 riastrad } 4286 1.1 riastrad /* set up the cs buffer */ 4287 1.1 riastrad dst_ptr = rdev->rlc.cs_ptr; 4288 1.1 riastrad if (rdev->family >= CHIP_BONAIRE) { 4289 1.1 riastrad cik_get_csb_buffer(rdev, dst_ptr); 4290 1.1 riastrad } else if (rdev->family >= CHIP_TAHITI) { 4291 1.1 riastrad reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256; 4292 1.1 riastrad dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr)); 4293 1.1 riastrad dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr)); 4294 1.1 riastrad dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size); 4295 1.1 riastrad si_get_csb_buffer(rdev, &dst_ptr[(256/4)]); 4296 1.1 riastrad } else { 4297 1.1 riastrad reg_list_hdr_blk_index = 0; 4298 1.1 riastrad reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4); 4299 1.1 riastrad data = upper_32_bits(reg_list_mc_addr); 4300 1.1 riastrad dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); 4301 1.1 riastrad reg_list_hdr_blk_index++; 4302 1.1 riastrad for (i = 0; cs_data[i].section != NULL; i++) { 4303 1.1 riastrad for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 4304 1.1 riastrad reg_num = cs_data[i].section[j].reg_count; 4305 1.1 riastrad data = reg_list_mc_addr & 0xffffffff; 4306 1.1 riastrad dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); 4307 1.1 riastrad reg_list_hdr_blk_index++; 4308 1.1 riastrad 4309 1.1 riastrad data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff; 4310 1.1 riastrad dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); 4311 1.1 riastrad reg_list_hdr_blk_index++; 4312 1.1 riastrad 4313 1.1 riastrad data = 0x08000000 | (reg_num * 4); 4314 1.1 riastrad dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); 4315 1.1 riastrad reg_list_hdr_blk_index++; 4316 1.1 riastrad 4317 1.1 riastrad for (k = 0; k < reg_num; k++) { 4318 1.1 riastrad data = cs_data[i].section[j].extent[k]; 4319 1.1 riastrad dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data); 4320 1.1 riastrad } 4321 1.1 riastrad reg_list_mc_addr += reg_num * 4; 4322 1.1 riastrad reg_list_blk_index += reg_num; 4323 1.1 riastrad } 4324 1.1 riastrad } 4325 1.1 riastrad dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER); 4326 1.1 riastrad } 4327 1.1 riastrad radeon_bo_kunmap(rdev->rlc.clear_state_obj); 4328 1.1 riastrad radeon_bo_unreserve(rdev->rlc.clear_state_obj); 4329 1.1 riastrad } 4330 1.1 riastrad 4331 1.1 riastrad if (rdev->rlc.cp_table_size) { 4332 1.1 riastrad if (rdev->rlc.cp_table_obj == NULL) { 4333 1.1 riastrad r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, 4334 1.1 riastrad PAGE_SIZE, true, 4335 1.1 riastrad RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4336 1.1 riastrad NULL, &rdev->rlc.cp_table_obj); 4337 1.1 riastrad if (r) { 4338 1.1 riastrad dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r); 4339 1.1 riastrad sumo_rlc_fini(rdev); 4340 1.1 riastrad return r; 4341 1.1 riastrad } 4342 1.1 riastrad } 4343 1.1 riastrad 4344 1.1 riastrad r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false); 4345 1.1 riastrad if (unlikely(r != 0)) { 4346 1.1 riastrad dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r); 4347 1.1 riastrad sumo_rlc_fini(rdev); 4348 1.1 riastrad return r; 4349 1.1 riastrad } 4350 1.1 riastrad r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM, 4351 1.1 riastrad &rdev->rlc.cp_table_gpu_addr); 4352 1.1 riastrad if (r) { 4353 1.1 riastrad radeon_bo_unreserve(rdev->rlc.cp_table_obj); 4354 1.1 riastrad dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r); 4355 1.1 riastrad sumo_rlc_fini(rdev); 4356 1.1 riastrad return r; 4357 1.1 riastrad } 4358 1.1 riastrad r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)__UNVOLATILE(&rdev->rlc.cp_table_ptr)); 4359 1.1 riastrad if (r) { 4360 1.1 riastrad dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r); 4361 1.1 riastrad sumo_rlc_fini(rdev); 4362 1.1 riastrad return r; 4363 1.1 riastrad } 4364 1.1 riastrad 4365 1.1 riastrad cik_init_cp_pg_table(rdev); 4366 1.1 riastrad 4367 1.1 riastrad radeon_bo_kunmap(rdev->rlc.cp_table_obj); 4368 1.1 riastrad radeon_bo_unreserve(rdev->rlc.cp_table_obj); 4369 1.1 riastrad 4370 1.1 riastrad } 4371 1.1 riastrad 4372 1.1 riastrad return 0; 4373 1.1 riastrad } 4374 1.1 riastrad 4375 1.1 riastrad static void evergreen_rlc_start(struct radeon_device *rdev) 4376 1.1 riastrad { 4377 1.1 riastrad u32 mask = RLC_ENABLE; 4378 1.1 riastrad 4379 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 4380 1.1 riastrad mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC; 4381 1.1 riastrad } 4382 1.1 riastrad 4383 1.1 riastrad WREG32(RLC_CNTL, mask); 4384 1.1 riastrad } 4385 1.1 riastrad 4386 1.1 riastrad int evergreen_rlc_resume(struct radeon_device *rdev) 4387 1.1 riastrad { 4388 1.1 riastrad u32 i; 4389 1.1 riastrad const __be32 *fw_data; 4390 1.1 riastrad 4391 1.1 riastrad if (!rdev->rlc_fw) 4392 1.1 riastrad return -EINVAL; 4393 1.1 riastrad 4394 1.1 riastrad r600_rlc_stop(rdev); 4395 1.1 riastrad 4396 1.1 riastrad WREG32(RLC_HB_CNTL, 0); 4397 1.1 riastrad 4398 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 4399 1.1 riastrad if (rdev->family == CHIP_ARUBA) { 4400 1.1 riastrad u32 always_on_bitmap = 4401 1.1 riastrad 3 | (3 << (16 * rdev->config.cayman.max_shader_engines)); 4402 1.1 riastrad /* find out the number of active simds */ 4403 1.1 riastrad u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; 4404 1.1 riastrad tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se; 4405 1.1 riastrad tmp = hweight32(~tmp); 4406 1.1 riastrad if (tmp == rdev->config.cayman.max_simds_per_se) { 4407 1.1 riastrad WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap); 4408 1.1 riastrad WREG32(TN_RLC_LB_PARAMS, 0x00601004); 4409 1.1 riastrad WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff); 4410 1.1 riastrad WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000); 4411 1.1 riastrad WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000); 4412 1.1 riastrad } 4413 1.1 riastrad } else { 4414 1.1 riastrad WREG32(RLC_HB_WPTR_LSB_ADDR, 0); 4415 1.1 riastrad WREG32(RLC_HB_WPTR_MSB_ADDR, 0); 4416 1.1 riastrad } 4417 1.1 riastrad WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); 4418 1.1 riastrad WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); 4419 1.1 riastrad } else { 4420 1.1 riastrad WREG32(RLC_HB_BASE, 0); 4421 1.1 riastrad WREG32(RLC_HB_RPTR, 0); 4422 1.1 riastrad WREG32(RLC_HB_WPTR, 0); 4423 1.1 riastrad WREG32(RLC_HB_WPTR_LSB_ADDR, 0); 4424 1.1 riastrad WREG32(RLC_HB_WPTR_MSB_ADDR, 0); 4425 1.1 riastrad } 4426 1.1 riastrad WREG32(RLC_MC_CNTL, 0); 4427 1.1 riastrad WREG32(RLC_UCODE_CNTL, 0); 4428 1.1 riastrad 4429 1.1 riastrad fw_data = (const __be32 *)rdev->rlc_fw->data; 4430 1.1 riastrad if (rdev->family >= CHIP_ARUBA) { 4431 1.1 riastrad for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) { 4432 1.1 riastrad WREG32(RLC_UCODE_ADDR, i); 4433 1.1 riastrad WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 4434 1.1 riastrad } 4435 1.1 riastrad } else if (rdev->family >= CHIP_CAYMAN) { 4436 1.1 riastrad for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) { 4437 1.1 riastrad WREG32(RLC_UCODE_ADDR, i); 4438 1.1 riastrad WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 4439 1.1 riastrad } 4440 1.1 riastrad } else { 4441 1.1 riastrad for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) { 4442 1.1 riastrad WREG32(RLC_UCODE_ADDR, i); 4443 1.1 riastrad WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 4444 1.1 riastrad } 4445 1.1 riastrad } 4446 1.1 riastrad WREG32(RLC_UCODE_ADDR, 0); 4447 1.1 riastrad 4448 1.1 riastrad evergreen_rlc_start(rdev); 4449 1.1 riastrad 4450 1.1 riastrad return 0; 4451 1.1 riastrad } 4452 1.1 riastrad 4453 1.1 riastrad /* Interrupts */ 4454 1.1 riastrad 4455 1.1 riastrad u32 evergreen_get_vblank_counter(struct radeon_device *rdev, int crtc) 4456 1.1 riastrad { 4457 1.1 riastrad if (crtc >= rdev->num_crtc) 4458 1.1 riastrad return 0; 4459 1.1 riastrad else 4460 1.1 riastrad return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); 4461 1.1 riastrad } 4462 1.1 riastrad 4463 1.1 riastrad void evergreen_disable_interrupt_state(struct radeon_device *rdev) 4464 1.1 riastrad { 4465 1.5 riastrad int i; 4466 1.1 riastrad u32 tmp; 4467 1.1 riastrad 4468 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4469 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 0, 4470 1.1 riastrad CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 4471 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 1, 0); 4472 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 2, 0); 4473 1.1 riastrad tmp = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE; 4474 1.1 riastrad WREG32(CAYMAN_DMA1_CNTL, tmp); 4475 1.1 riastrad } else 4476 1.1 riastrad WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 4477 1.1 riastrad tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE; 4478 1.1 riastrad WREG32(DMA_CNTL, tmp); 4479 1.1 riastrad WREG32(GRBM_INT_CNTL, 0); 4480 1.1 riastrad WREG32(SRBM_INT_CNTL, 0); 4481 1.5 riastrad for (i = 0; i < rdev->num_crtc; i++) 4482 1.5 riastrad WREG32(INT_MASK + crtc_offsets[i], 0); 4483 1.5 riastrad for (i = 0; i < rdev->num_crtc; i++) 4484 1.5 riastrad WREG32(GRPH_INT_CONTROL + crtc_offsets[i], 0); 4485 1.1 riastrad 4486 1.1 riastrad /* only one DAC on DCE5 */ 4487 1.1 riastrad if (!ASIC_IS_DCE5(rdev)) 4488 1.1 riastrad WREG32(DACA_AUTODETECT_INT_CONTROL, 0); 4489 1.1 riastrad WREG32(DACB_AUTODETECT_INT_CONTROL, 0); 4490 1.1 riastrad 4491 1.5 riastrad for (i = 0; i < 6; i++) 4492 1.5 riastrad WREG32_AND(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_POLARITY); 4493 1.1 riastrad } 4494 1.1 riastrad 4495 1.5 riastrad /* Note that the order we write back regs here is important */ 4496 1.1 riastrad int evergreen_irq_set(struct radeon_device *rdev) 4497 1.1 riastrad { 4498 1.5 riastrad int i; 4499 1.1 riastrad u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; 4500 1.1 riastrad u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0; 4501 1.1 riastrad u32 grbm_int_cntl = 0; 4502 1.1 riastrad u32 dma_cntl, dma_cntl1 = 0; 4503 1.1 riastrad u32 thermal_int = 0; 4504 1.1 riastrad 4505 1.1 riastrad if (!rdev->irq.installed) { 4506 1.1 riastrad WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); 4507 1.1 riastrad return -EINVAL; 4508 1.1 riastrad } 4509 1.1 riastrad /* don't enable anything if the ih is disabled */ 4510 1.1 riastrad if (!rdev->ih.enabled) { 4511 1.1 riastrad r600_disable_interrupts(rdev); 4512 1.1 riastrad /* force the active interrupt state to all disabled */ 4513 1.1 riastrad evergreen_disable_interrupt_state(rdev); 4514 1.1 riastrad return 0; 4515 1.1 riastrad } 4516 1.1 riastrad 4517 1.1 riastrad if (rdev->family == CHIP_ARUBA) 4518 1.1 riastrad thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) & 4519 1.1 riastrad ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 4520 1.1 riastrad else 4521 1.1 riastrad thermal_int = RREG32(CG_THERMAL_INT) & 4522 1.1 riastrad ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 4523 1.1 riastrad 4524 1.1 riastrad dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE; 4525 1.1 riastrad 4526 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4527 1.1 riastrad /* enable CP interrupts on all rings */ 4528 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) { 4529 1.1 riastrad DRM_DEBUG("evergreen_irq_set: sw int gfx\n"); 4530 1.1 riastrad cp_int_cntl |= TIME_STAMP_INT_ENABLE; 4531 1.1 riastrad } 4532 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) { 4533 1.1 riastrad DRM_DEBUG("evergreen_irq_set: sw int cp1\n"); 4534 1.1 riastrad cp_int_cntl1 |= TIME_STAMP_INT_ENABLE; 4535 1.1 riastrad } 4536 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) { 4537 1.1 riastrad DRM_DEBUG("evergreen_irq_set: sw int cp2\n"); 4538 1.1 riastrad cp_int_cntl2 |= TIME_STAMP_INT_ENABLE; 4539 1.1 riastrad } 4540 1.1 riastrad } else { 4541 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) { 4542 1.1 riastrad DRM_DEBUG("evergreen_irq_set: sw int gfx\n"); 4543 1.1 riastrad cp_int_cntl |= RB_INT_ENABLE; 4544 1.1 riastrad cp_int_cntl |= TIME_STAMP_INT_ENABLE; 4545 1.1 riastrad } 4546 1.1 riastrad } 4547 1.1 riastrad 4548 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) { 4549 1.1 riastrad DRM_DEBUG("r600_irq_set: sw int dma\n"); 4550 1.1 riastrad dma_cntl |= TRAP_ENABLE; 4551 1.1 riastrad } 4552 1.1 riastrad 4553 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4554 1.1 riastrad dma_cntl1 = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE; 4555 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) { 4556 1.1 riastrad DRM_DEBUG("r600_irq_set: sw int dma1\n"); 4557 1.1 riastrad dma_cntl1 |= TRAP_ENABLE; 4558 1.1 riastrad } 4559 1.1 riastrad } 4560 1.1 riastrad 4561 1.1 riastrad if (rdev->irq.dpm_thermal) { 4562 1.1 riastrad DRM_DEBUG("dpm thermal\n"); 4563 1.1 riastrad thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; 4564 1.1 riastrad } 4565 1.1 riastrad 4566 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4567 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl); 4568 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1); 4569 1.1 riastrad cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2); 4570 1.1 riastrad } else 4571 1.1 riastrad WREG32(CP_INT_CNTL, cp_int_cntl); 4572 1.1 riastrad 4573 1.1 riastrad WREG32(DMA_CNTL, dma_cntl); 4574 1.1 riastrad 4575 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) 4576 1.1 riastrad WREG32(CAYMAN_DMA1_CNTL, dma_cntl1); 4577 1.1 riastrad 4578 1.1 riastrad WREG32(GRBM_INT_CNTL, grbm_int_cntl); 4579 1.1 riastrad 4580 1.5 riastrad for (i = 0; i < rdev->num_crtc; i++) { 4581 1.5 riastrad radeon_irq_kms_set_irq_n_enabled( 4582 1.5 riastrad rdev, INT_MASK + crtc_offsets[i], 4583 1.5 riastrad VBLANK_INT_MASK, 4584 1.5 riastrad rdev->irq.crtc_vblank_int[i] || 4585 1.5 riastrad atomic_read(&rdev->irq.pflip[i]), "vblank", i); 4586 1.5 riastrad } 4587 1.5 riastrad 4588 1.5 riastrad for (i = 0; i < rdev->num_crtc; i++) 4589 1.5 riastrad WREG32(GRPH_INT_CONTROL + crtc_offsets[i], GRPH_PFLIP_INT_MASK); 4590 1.5 riastrad 4591 1.5 riastrad for (i = 0; i < 6; i++) { 4592 1.5 riastrad radeon_irq_kms_set_irq_n_enabled( 4593 1.5 riastrad rdev, DC_HPDx_INT_CONTROL(i), 4594 1.5 riastrad DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN, 4595 1.5 riastrad rdev->irq.hpd[i], "HPD", i); 4596 1.5 riastrad } 4597 1.5 riastrad 4598 1.1 riastrad if (rdev->family == CHIP_ARUBA) 4599 1.1 riastrad WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int); 4600 1.1 riastrad else 4601 1.1 riastrad WREG32(CG_THERMAL_INT, thermal_int); 4602 1.1 riastrad 4603 1.5 riastrad for (i = 0; i < 6; i++) { 4604 1.5 riastrad radeon_irq_kms_set_irq_n_enabled( 4605 1.5 riastrad rdev, AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i], 4606 1.5 riastrad AFMT_AZ_FORMAT_WTRIG_MASK, 4607 1.5 riastrad rdev->irq.afmt[i], "HDMI", i); 4608 1.5 riastrad } 4609 1.1 riastrad 4610 1.1 riastrad /* posting read */ 4611 1.1 riastrad RREG32(SRBM_STATUS); 4612 1.1 riastrad 4613 1.1 riastrad return 0; 4614 1.1 riastrad } 4615 1.1 riastrad 4616 1.5 riastrad /* Note that the order we write back regs here is important */ 4617 1.1 riastrad static void evergreen_irq_ack(struct radeon_device *rdev) 4618 1.1 riastrad { 4619 1.5 riastrad int i, j; 4620 1.5 riastrad u32 *grph_int = rdev->irq.stat_regs.evergreen.grph_int; 4621 1.5 riastrad u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int; 4622 1.5 riastrad u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status; 4623 1.5 riastrad 4624 1.5 riastrad for (i = 0; i < 6; i++) { 4625 1.5 riastrad disp_int[i] = RREG32(evergreen_disp_int_status[i]); 4626 1.5 riastrad afmt_status[i] = RREG32(AFMT_STATUS + crtc_offsets[i]); 4627 1.5 riastrad if (i < rdev->num_crtc) 4628 1.5 riastrad grph_int[i] = RREG32(GRPH_INT_STATUS + crtc_offsets[i]); 4629 1.5 riastrad } 4630 1.5 riastrad 4631 1.5 riastrad /* We write back each interrupt register in pairs of two */ 4632 1.5 riastrad for (i = 0; i < rdev->num_crtc; i += 2) { 4633 1.5 riastrad for (j = i; j < (i + 2); j++) { 4634 1.5 riastrad if (grph_int[j] & GRPH_PFLIP_INT_OCCURRED) 4635 1.5 riastrad WREG32(GRPH_INT_STATUS + crtc_offsets[j], 4636 1.5 riastrad GRPH_PFLIP_INT_CLEAR); 4637 1.5 riastrad } 4638 1.5 riastrad 4639 1.5 riastrad for (j = i; j < (i + 2); j++) { 4640 1.5 riastrad if (disp_int[j] & LB_D1_VBLANK_INTERRUPT) 4641 1.5 riastrad WREG32(VBLANK_STATUS + crtc_offsets[j], 4642 1.5 riastrad VBLANK_ACK); 4643 1.5 riastrad if (disp_int[j] & LB_D1_VLINE_INTERRUPT) 4644 1.5 riastrad WREG32(VLINE_STATUS + crtc_offsets[j], 4645 1.5 riastrad VLINE_ACK); 4646 1.5 riastrad } 4647 1.5 riastrad } 4648 1.5 riastrad 4649 1.5 riastrad for (i = 0; i < 6; i++) { 4650 1.5 riastrad if (disp_int[i] & DC_HPD1_INTERRUPT) 4651 1.5 riastrad WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_ACK); 4652 1.5 riastrad } 4653 1.5 riastrad 4654 1.5 riastrad for (i = 0; i < 6; i++) { 4655 1.5 riastrad if (disp_int[i] & DC_HPD1_RX_INTERRUPT) 4656 1.5 riastrad WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_RX_INT_ACK); 4657 1.5 riastrad } 4658 1.1 riastrad 4659 1.5 riastrad for (i = 0; i < 6; i++) { 4660 1.5 riastrad if (afmt_status[i] & AFMT_AZ_FORMAT_WTRIG) 4661 1.5 riastrad WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i], 4662 1.5 riastrad AFMT_AZ_FORMAT_WTRIG_ACK); 4663 1.1 riastrad } 4664 1.1 riastrad } 4665 1.1 riastrad 4666 1.1 riastrad static void evergreen_irq_disable(struct radeon_device *rdev) 4667 1.1 riastrad { 4668 1.1 riastrad r600_disable_interrupts(rdev); 4669 1.1 riastrad /* Wait and acknowledge irq */ 4670 1.1 riastrad mdelay(1); 4671 1.1 riastrad evergreen_irq_ack(rdev); 4672 1.1 riastrad evergreen_disable_interrupt_state(rdev); 4673 1.1 riastrad } 4674 1.1 riastrad 4675 1.1 riastrad void evergreen_irq_suspend(struct radeon_device *rdev) 4676 1.1 riastrad { 4677 1.1 riastrad evergreen_irq_disable(rdev); 4678 1.1 riastrad r600_rlc_stop(rdev); 4679 1.1 riastrad } 4680 1.1 riastrad 4681 1.1 riastrad static u32 evergreen_get_ih_wptr(struct radeon_device *rdev) 4682 1.1 riastrad { 4683 1.1 riastrad u32 wptr, tmp; 4684 1.1 riastrad 4685 1.1 riastrad if (rdev->wb.enabled) 4686 1.1 riastrad wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); 4687 1.1 riastrad else 4688 1.1 riastrad wptr = RREG32(IH_RB_WPTR); 4689 1.1 riastrad 4690 1.1 riastrad if (wptr & RB_OVERFLOW) { 4691 1.1 riastrad wptr &= ~RB_OVERFLOW; 4692 1.1 riastrad /* When a ring buffer overflow happen start parsing interrupt 4693 1.1 riastrad * from the last not overwritten vector (wptr + 16). Hopefully 4694 1.1 riastrad * this should allow us to catchup. 4695 1.1 riastrad */ 4696 1.1 riastrad dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n", 4697 1.1 riastrad wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask); 4698 1.1 riastrad rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; 4699 1.1 riastrad tmp = RREG32(IH_RB_CNTL); 4700 1.1 riastrad tmp |= IH_WPTR_OVERFLOW_CLEAR; 4701 1.1 riastrad WREG32(IH_RB_CNTL, tmp); 4702 1.1 riastrad } 4703 1.1 riastrad return (wptr & rdev->ih.ptr_mask); 4704 1.1 riastrad } 4705 1.1 riastrad 4706 1.1 riastrad int evergreen_irq_process(struct radeon_device *rdev) 4707 1.1 riastrad { 4708 1.5 riastrad u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int; 4709 1.5 riastrad u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status; 4710 1.5 riastrad u32 crtc_idx, hpd_idx, afmt_idx; 4711 1.5 riastrad u32 mask; 4712 1.1 riastrad u32 wptr; 4713 1.1 riastrad u32 rptr; 4714 1.1 riastrad u32 src_id, src_data; 4715 1.1 riastrad u32 ring_index; 4716 1.1 riastrad bool queue_hotplug = false; 4717 1.1 riastrad bool queue_hdmi = false; 4718 1.1 riastrad bool queue_dp = false; 4719 1.1 riastrad bool queue_thermal = false; 4720 1.1 riastrad u32 status, addr; 4721 1.5 riastrad const char *event_name; 4722 1.1 riastrad 4723 1.1 riastrad if (!rdev->ih.enabled || rdev->shutdown) 4724 1.1 riastrad return IRQ_NONE; 4725 1.1 riastrad 4726 1.1 riastrad wptr = evergreen_get_ih_wptr(rdev); 4727 1.1 riastrad 4728 1.1 riastrad restart_ih: 4729 1.1 riastrad /* is somebody else already processing irqs? */ 4730 1.1 riastrad if (atomic_xchg(&rdev->ih.lock, 1)) 4731 1.1 riastrad return IRQ_NONE; 4732 1.1 riastrad 4733 1.1 riastrad rptr = rdev->ih.rptr; 4734 1.1 riastrad DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr); 4735 1.1 riastrad 4736 1.1 riastrad /* Order reading of wptr vs. reading of IH ring data */ 4737 1.1 riastrad rmb(); 4738 1.1 riastrad 4739 1.1 riastrad /* display interrupts */ 4740 1.1 riastrad evergreen_irq_ack(rdev); 4741 1.1 riastrad 4742 1.1 riastrad while (rptr != wptr) { 4743 1.1 riastrad /* wptr/rptr are in bytes! */ 4744 1.1 riastrad ring_index = rptr / 4; 4745 1.1 riastrad src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff; 4746 1.1 riastrad src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff; 4747 1.1 riastrad 4748 1.1 riastrad switch (src_id) { 4749 1.1 riastrad case 1: /* D1 vblank/vline */ 4750 1.1 riastrad case 2: /* D2 vblank/vline */ 4751 1.5 riastrad case 3: /* D3 vblank/vline */ 4752 1.5 riastrad case 4: /* D4 vblank/vline */ 4753 1.5 riastrad case 5: /* D5 vblank/vline */ 4754 1.5 riastrad case 6: /* D6 vblank/vline */ 4755 1.5 riastrad crtc_idx = src_id - 1; 4756 1.1 riastrad 4757 1.5 riastrad if (src_data == 0) { /* vblank */ 4758 1.5 riastrad mask = LB_D1_VBLANK_INTERRUPT; 4759 1.5 riastrad event_name = "vblank"; 4760 1.1 riastrad 4761 1.5 riastrad if (rdev->irq.crtc_vblank_int[crtc_idx]) { 4762 1.5 riastrad drm_handle_vblank(rdev->ddev, crtc_idx); 4763 1.1 riastrad #ifdef __NetBSD__ 4764 1.1 riastrad spin_lock(&rdev->irq.vblank_lock); 4765 1.1 riastrad rdev->pm.vblank_sync = true; 4766 1.1 riastrad DRM_SPIN_WAKEUP_ONE(&rdev->irq.vblank_queue, &rdev->irq.vblank_lock); 4767 1.1 riastrad spin_unlock(&rdev->irq.vblank_lock); 4768 1.1 riastrad #else 4769 1.1 riastrad rdev->pm.vblank_sync = true; 4770 1.1 riastrad wake_up(&rdev->irq.vblank_queue); 4771 1.1 riastrad #endif 4772 1.1 riastrad } 4773 1.5 riastrad if (atomic_read(&rdev->irq.pflip[crtc_idx])) { 4774 1.5 riastrad radeon_crtc_handle_vblank(rdev, 4775 1.5 riastrad crtc_idx); 4776 1.1 riastrad } 4777 1.1 riastrad 4778 1.5 riastrad } else if (src_data == 1) { /* vline */ 4779 1.5 riastrad mask = LB_D1_VLINE_INTERRUPT; 4780 1.5 riastrad event_name = "vline"; 4781 1.5 riastrad } else { 4782 1.5 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", 4783 1.5 riastrad src_id, src_data); 4784 1.1 riastrad break; 4785 1.1 riastrad } 4786 1.1 riastrad 4787 1.5 riastrad if (!(disp_int[crtc_idx] & mask)) { 4788 1.5 riastrad DRM_DEBUG("IH: D%d %s - IH event w/o asserted irq bit?\n", 4789 1.5 riastrad crtc_idx + 1, event_name); 4790 1.1 riastrad } 4791 1.1 riastrad 4792 1.5 riastrad disp_int[crtc_idx] &= ~mask; 4793 1.5 riastrad DRM_DEBUG("IH: D%d %s\n", crtc_idx + 1, event_name); 4794 1.1 riastrad 4795 1.1 riastrad break; 4796 1.1 riastrad case 8: /* D1 page flip */ 4797 1.1 riastrad case 10: /* D2 page flip */ 4798 1.1 riastrad case 12: /* D3 page flip */ 4799 1.1 riastrad case 14: /* D4 page flip */ 4800 1.1 riastrad case 16: /* D5 page flip */ 4801 1.1 riastrad case 18: /* D6 page flip */ 4802 1.1 riastrad DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); 4803 1.1 riastrad if (radeon_use_pflipirq > 0) 4804 1.1 riastrad radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 4805 1.1 riastrad break; 4806 1.1 riastrad case 42: /* HPD hotplug */ 4807 1.5 riastrad if (src_data <= 5) { 4808 1.5 riastrad hpd_idx = src_data; 4809 1.5 riastrad mask = DC_HPD1_INTERRUPT; 4810 1.1 riastrad queue_hotplug = true; 4811 1.5 riastrad event_name = "HPD"; 4812 1.1 riastrad 4813 1.5 riastrad } else if (src_data <= 11) { 4814 1.5 riastrad hpd_idx = src_data - 6; 4815 1.5 riastrad mask = DC_HPD1_RX_INTERRUPT; 4816 1.1 riastrad queue_dp = true; 4817 1.5 riastrad event_name = "HPD_RX"; 4818 1.1 riastrad 4819 1.5 riastrad } else { 4820 1.5 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", 4821 1.5 riastrad src_id, src_data); 4822 1.1 riastrad break; 4823 1.5 riastrad } 4824 1.1 riastrad 4825 1.5 riastrad if (!(disp_int[hpd_idx] & mask)) 4826 1.5 riastrad DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); 4827 1.1 riastrad 4828 1.5 riastrad disp_int[hpd_idx] &= ~mask; 4829 1.5 riastrad DRM_DEBUG("IH: %s%d\n", event_name, hpd_idx + 1); 4830 1.1 riastrad 4831 1.1 riastrad break; 4832 1.1 riastrad case 44: /* hdmi */ 4833 1.5 riastrad afmt_idx = src_data; 4834 1.5 riastrad if (!(afmt_status[afmt_idx] & AFMT_AZ_FORMAT_WTRIG)) 4835 1.5 riastrad DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); 4836 1.5 riastrad 4837 1.5 riastrad if (afmt_idx > 5) { 4838 1.5 riastrad DRM_ERROR("Unhandled interrupt: %d %d\n", 4839 1.5 riastrad src_id, src_data); 4840 1.1 riastrad break; 4841 1.1 riastrad } 4842 1.5 riastrad afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG; 4843 1.5 riastrad queue_hdmi = true; 4844 1.5 riastrad DRM_DEBUG("IH: HDMI%d\n", afmt_idx + 1); 4845 1.3 mrg break; 4846 1.1 riastrad case 96: 4847 1.1 riastrad DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); 4848 1.1 riastrad WREG32(SRBM_INT_ACK, 0x1); 4849 1.1 riastrad break; 4850 1.1 riastrad case 124: /* UVD */ 4851 1.1 riastrad DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); 4852 1.1 riastrad radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); 4853 1.1 riastrad break; 4854 1.1 riastrad case 146: 4855 1.1 riastrad case 147: 4856 1.1 riastrad addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR); 4857 1.1 riastrad status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS); 4858 1.1 riastrad /* reset addr and status */ 4859 1.1 riastrad WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); 4860 1.1 riastrad if (addr == 0x0 && status == 0x0) 4861 1.1 riastrad break; 4862 1.1 riastrad dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); 4863 1.1 riastrad dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 4864 1.1 riastrad addr); 4865 1.1 riastrad dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 4866 1.1 riastrad status); 4867 1.1 riastrad cayman_vm_decode_fault(rdev, status, addr); 4868 1.1 riastrad break; 4869 1.1 riastrad case 176: /* CP_INT in ring buffer */ 4870 1.1 riastrad case 177: /* CP_INT in IB1 */ 4871 1.1 riastrad case 178: /* CP_INT in IB2 */ 4872 1.1 riastrad DRM_DEBUG("IH: CP int: 0x%08x\n", src_data); 4873 1.1 riastrad radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 4874 1.1 riastrad break; 4875 1.1 riastrad case 181: /* CP EOP event */ 4876 1.1 riastrad DRM_DEBUG("IH: CP EOP\n"); 4877 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4878 1.1 riastrad switch (src_data) { 4879 1.1 riastrad case 0: 4880 1.1 riastrad radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 4881 1.1 riastrad break; 4882 1.1 riastrad case 1: 4883 1.1 riastrad radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX); 4884 1.1 riastrad break; 4885 1.1 riastrad case 2: 4886 1.1 riastrad radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX); 4887 1.1 riastrad break; 4888 1.1 riastrad } 4889 1.1 riastrad } else 4890 1.1 riastrad radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 4891 1.1 riastrad break; 4892 1.1 riastrad case 224: /* DMA trap event */ 4893 1.1 riastrad DRM_DEBUG("IH: DMA trap\n"); 4894 1.1 riastrad radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX); 4895 1.1 riastrad break; 4896 1.1 riastrad case 230: /* thermal low to high */ 4897 1.1 riastrad DRM_DEBUG("IH: thermal low to high\n"); 4898 1.1 riastrad rdev->pm.dpm.thermal.high_to_low = false; 4899 1.1 riastrad queue_thermal = true; 4900 1.1 riastrad break; 4901 1.1 riastrad case 231: /* thermal high to low */ 4902 1.1 riastrad DRM_DEBUG("IH: thermal high to low\n"); 4903 1.1 riastrad rdev->pm.dpm.thermal.high_to_low = true; 4904 1.1 riastrad queue_thermal = true; 4905 1.1 riastrad break; 4906 1.1 riastrad case 233: /* GUI IDLE */ 4907 1.1 riastrad DRM_DEBUG("IH: GUI idle\n"); 4908 1.1 riastrad break; 4909 1.1 riastrad case 244: /* DMA trap event */ 4910 1.1 riastrad if (rdev->family >= CHIP_CAYMAN) { 4911 1.1 riastrad DRM_DEBUG("IH: DMA1 trap\n"); 4912 1.1 riastrad radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX); 4913 1.1 riastrad } 4914 1.1 riastrad break; 4915 1.1 riastrad default: 4916 1.1 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 4917 1.1 riastrad break; 4918 1.1 riastrad } 4919 1.1 riastrad 4920 1.1 riastrad /* wptr/rptr are in bytes! */ 4921 1.1 riastrad rptr += 16; 4922 1.1 riastrad rptr &= rdev->ih.ptr_mask; 4923 1.1 riastrad WREG32(IH_RB_RPTR, rptr); 4924 1.1 riastrad } 4925 1.1 riastrad if (queue_dp) 4926 1.1 riastrad schedule_work(&rdev->dp_work); 4927 1.1 riastrad if (queue_hotplug) 4928 1.1 riastrad schedule_delayed_work(&rdev->hotplug_work, 0); 4929 1.1 riastrad if (queue_hdmi) 4930 1.1 riastrad schedule_work(&rdev->audio_work); 4931 1.1 riastrad if (queue_thermal && rdev->pm.dpm_enabled) 4932 1.1 riastrad schedule_work(&rdev->pm.dpm.thermal.work); 4933 1.1 riastrad rdev->ih.rptr = rptr; 4934 1.1 riastrad atomic_set(&rdev->ih.lock, 0); 4935 1.1 riastrad 4936 1.1 riastrad /* make sure wptr hasn't changed while processing */ 4937 1.1 riastrad wptr = evergreen_get_ih_wptr(rdev); 4938 1.1 riastrad if (wptr != rptr) 4939 1.1 riastrad goto restart_ih; 4940 1.1 riastrad 4941 1.1 riastrad return IRQ_HANDLED; 4942 1.1 riastrad } 4943 1.1 riastrad 4944 1.5 riastrad static void evergreen_uvd_init(struct radeon_device *rdev) 4945 1.5 riastrad { 4946 1.5 riastrad int r; 4947 1.5 riastrad 4948 1.5 riastrad if (!rdev->has_uvd) 4949 1.5 riastrad return; 4950 1.5 riastrad 4951 1.5 riastrad r = radeon_uvd_init(rdev); 4952 1.5 riastrad if (r) { 4953 1.5 riastrad dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 4954 1.5 riastrad /* 4955 1.5 riastrad * At this point rdev->uvd.vcpu_bo is NULL which trickles down 4956 1.5 riastrad * to early fails uvd_v2_2_resume() and thus nothing happens 4957 1.5 riastrad * there. So it is pointless to try to go through that code 4958 1.5 riastrad * hence why we disable uvd here. 4959 1.5 riastrad */ 4960 1.5 riastrad rdev->has_uvd = false; 4961 1.5 riastrad return; 4962 1.5 riastrad } 4963 1.5 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 4964 1.5 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 4965 1.5 riastrad } 4966 1.5 riastrad 4967 1.5 riastrad static void evergreen_uvd_start(struct radeon_device *rdev) 4968 1.5 riastrad { 4969 1.5 riastrad int r; 4970 1.5 riastrad 4971 1.5 riastrad if (!rdev->has_uvd) 4972 1.5 riastrad return; 4973 1.5 riastrad 4974 1.5 riastrad r = uvd_v2_2_resume(rdev); 4975 1.5 riastrad if (r) { 4976 1.5 riastrad dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 4977 1.5 riastrad goto error; 4978 1.5 riastrad } 4979 1.5 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 4980 1.5 riastrad if (r) { 4981 1.5 riastrad dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 4982 1.5 riastrad goto error; 4983 1.5 riastrad } 4984 1.5 riastrad return; 4985 1.5 riastrad 4986 1.5 riastrad error: 4987 1.5 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 4988 1.5 riastrad } 4989 1.5 riastrad 4990 1.5 riastrad static void evergreen_uvd_resume(struct radeon_device *rdev) 4991 1.5 riastrad { 4992 1.5 riastrad struct radeon_ring *ring; 4993 1.5 riastrad int r; 4994 1.5 riastrad 4995 1.5 riastrad if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 4996 1.5 riastrad return; 4997 1.5 riastrad 4998 1.5 riastrad ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 4999 1.5 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 5000 1.5 riastrad if (r) { 5001 1.5 riastrad dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 5002 1.5 riastrad return; 5003 1.5 riastrad } 5004 1.5 riastrad r = uvd_v1_0_init(rdev); 5005 1.5 riastrad if (r) { 5006 1.5 riastrad dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 5007 1.5 riastrad return; 5008 1.5 riastrad } 5009 1.5 riastrad } 5010 1.5 riastrad 5011 1.1 riastrad static int evergreen_startup(struct radeon_device *rdev) 5012 1.1 riastrad { 5013 1.1 riastrad struct radeon_ring *ring; 5014 1.1 riastrad int r; 5015 1.1 riastrad 5016 1.1 riastrad /* enable pcie gen2 link */ 5017 1.1 riastrad evergreen_pcie_gen2_enable(rdev); 5018 1.1 riastrad /* enable aspm */ 5019 1.1 riastrad evergreen_program_aspm(rdev); 5020 1.1 riastrad 5021 1.1 riastrad /* scratch needs to be initialized before MC */ 5022 1.1 riastrad r = r600_vram_scratch_init(rdev); 5023 1.1 riastrad if (r) 5024 1.1 riastrad return r; 5025 1.1 riastrad 5026 1.1 riastrad evergreen_mc_program(rdev); 5027 1.1 riastrad 5028 1.1 riastrad if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) { 5029 1.1 riastrad r = ni_mc_load_microcode(rdev); 5030 1.1 riastrad if (r) { 5031 1.1 riastrad DRM_ERROR("Failed to load MC firmware!\n"); 5032 1.1 riastrad return r; 5033 1.1 riastrad } 5034 1.1 riastrad } 5035 1.1 riastrad 5036 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 5037 1.1 riastrad evergreen_agp_enable(rdev); 5038 1.1 riastrad } else { 5039 1.1 riastrad r = evergreen_pcie_gart_enable(rdev); 5040 1.1 riastrad if (r) 5041 1.1 riastrad return r; 5042 1.1 riastrad } 5043 1.1 riastrad evergreen_gpu_init(rdev); 5044 1.1 riastrad 5045 1.1 riastrad /* allocate rlc buffers */ 5046 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 5047 1.1 riastrad rdev->rlc.reg_list = sumo_rlc_save_restore_register_list; 5048 1.1 riastrad rdev->rlc.reg_list_size = 5049 1.1 riastrad (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list); 5050 1.1 riastrad rdev->rlc.cs_data = evergreen_cs_data; 5051 1.1 riastrad r = sumo_rlc_init(rdev); 5052 1.1 riastrad if (r) { 5053 1.1 riastrad DRM_ERROR("Failed to init rlc BOs!\n"); 5054 1.1 riastrad return r; 5055 1.1 riastrad } 5056 1.1 riastrad } 5057 1.1 riastrad 5058 1.1 riastrad /* allocate wb buffer */ 5059 1.1 riastrad r = radeon_wb_init(rdev); 5060 1.1 riastrad if (r) 5061 1.1 riastrad return r; 5062 1.1 riastrad 5063 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 5064 1.1 riastrad if (r) { 5065 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 5066 1.1 riastrad return r; 5067 1.1 riastrad } 5068 1.1 riastrad 5069 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 5070 1.1 riastrad if (r) { 5071 1.1 riastrad dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 5072 1.1 riastrad return r; 5073 1.1 riastrad } 5074 1.1 riastrad 5075 1.5 riastrad evergreen_uvd_start(rdev); 5076 1.1 riastrad 5077 1.1 riastrad /* Enable IRQ */ 5078 1.1 riastrad if (!rdev->irq.installed) { 5079 1.1 riastrad r = radeon_irq_kms_init(rdev); 5080 1.1 riastrad if (r) 5081 1.1 riastrad return r; 5082 1.1 riastrad } 5083 1.1 riastrad 5084 1.1 riastrad r = r600_irq_init(rdev); 5085 1.1 riastrad if (r) { 5086 1.1 riastrad DRM_ERROR("radeon: IH init failed (%d).\n", r); 5087 1.1 riastrad radeon_irq_kms_fini(rdev); 5088 1.1 riastrad return r; 5089 1.1 riastrad } 5090 1.1 riastrad evergreen_irq_set(rdev); 5091 1.1 riastrad 5092 1.1 riastrad ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 5093 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 5094 1.1 riastrad RADEON_CP_PACKET2); 5095 1.1 riastrad if (r) 5096 1.1 riastrad return r; 5097 1.1 riastrad 5098 1.1 riastrad ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 5099 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 5100 1.1 riastrad DMA_PACKET(DMA_PACKET_NOP, 0, 0)); 5101 1.1 riastrad if (r) 5102 1.1 riastrad return r; 5103 1.1 riastrad 5104 1.1 riastrad r = evergreen_cp_load_microcode(rdev); 5105 1.1 riastrad if (r) 5106 1.1 riastrad return r; 5107 1.1 riastrad r = evergreen_cp_resume(rdev); 5108 1.1 riastrad if (r) 5109 1.1 riastrad return r; 5110 1.1 riastrad r = r600_dma_resume(rdev); 5111 1.1 riastrad if (r) 5112 1.1 riastrad return r; 5113 1.1 riastrad 5114 1.5 riastrad evergreen_uvd_resume(rdev); 5115 1.1 riastrad 5116 1.1 riastrad r = radeon_ib_pool_init(rdev); 5117 1.1 riastrad if (r) { 5118 1.1 riastrad dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 5119 1.1 riastrad return r; 5120 1.1 riastrad } 5121 1.1 riastrad 5122 1.1 riastrad r = radeon_audio_init(rdev); 5123 1.1 riastrad if (r) { 5124 1.1 riastrad DRM_ERROR("radeon: audio init failed\n"); 5125 1.1 riastrad return r; 5126 1.1 riastrad } 5127 1.1 riastrad 5128 1.1 riastrad return 0; 5129 1.1 riastrad } 5130 1.1 riastrad 5131 1.1 riastrad int evergreen_resume(struct radeon_device *rdev) 5132 1.1 riastrad { 5133 1.1 riastrad int r; 5134 1.1 riastrad 5135 1.1 riastrad /* reset the asic, the gfx blocks are often in a bad state 5136 1.1 riastrad * after the driver is unloaded or after a resume 5137 1.1 riastrad */ 5138 1.1 riastrad if (radeon_asic_reset(rdev)) 5139 1.1 riastrad dev_warn(rdev->dev, "GPU reset failed !\n"); 5140 1.1 riastrad /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 5141 1.1 riastrad * posting will perform necessary task to bring back GPU into good 5142 1.1 riastrad * shape. 5143 1.1 riastrad */ 5144 1.1 riastrad /* post card */ 5145 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 5146 1.1 riastrad 5147 1.1 riastrad /* init golden registers */ 5148 1.1 riastrad evergreen_init_golden_registers(rdev); 5149 1.1 riastrad 5150 1.1 riastrad if (rdev->pm.pm_method == PM_METHOD_DPM) 5151 1.1 riastrad radeon_pm_resume(rdev); 5152 1.1 riastrad 5153 1.1 riastrad rdev->accel_working = true; 5154 1.1 riastrad r = evergreen_startup(rdev); 5155 1.1 riastrad if (r) { 5156 1.1 riastrad DRM_ERROR("evergreen startup failed on resume\n"); 5157 1.1 riastrad rdev->accel_working = false; 5158 1.1 riastrad return r; 5159 1.1 riastrad } 5160 1.1 riastrad 5161 1.1 riastrad return r; 5162 1.1 riastrad 5163 1.1 riastrad } 5164 1.1 riastrad 5165 1.1 riastrad int evergreen_suspend(struct radeon_device *rdev) 5166 1.1 riastrad { 5167 1.1 riastrad radeon_pm_suspend(rdev); 5168 1.1 riastrad radeon_audio_fini(rdev); 5169 1.5 riastrad if (rdev->has_uvd) { 5170 1.5 riastrad uvd_v1_0_fini(rdev); 5171 1.5 riastrad radeon_uvd_suspend(rdev); 5172 1.5 riastrad } 5173 1.1 riastrad r700_cp_stop(rdev); 5174 1.1 riastrad r600_dma_stop(rdev); 5175 1.1 riastrad evergreen_irq_suspend(rdev); 5176 1.1 riastrad radeon_wb_disable(rdev); 5177 1.1 riastrad evergreen_pcie_gart_disable(rdev); 5178 1.1 riastrad 5179 1.1 riastrad return 0; 5180 1.1 riastrad } 5181 1.1 riastrad 5182 1.1 riastrad /* Plan is to move initialization in that function and use 5183 1.1 riastrad * helper function so that radeon_device_init pretty much 5184 1.1 riastrad * do nothing more than calling asic specific function. This 5185 1.1 riastrad * should also allow to remove a bunch of callback function 5186 1.1 riastrad * like vram_info. 5187 1.1 riastrad */ 5188 1.1 riastrad int evergreen_init(struct radeon_device *rdev) 5189 1.1 riastrad { 5190 1.1 riastrad int r; 5191 1.1 riastrad 5192 1.1 riastrad /* Read BIOS */ 5193 1.1 riastrad if (!radeon_get_bios(rdev)) { 5194 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 5195 1.1 riastrad return -EINVAL; 5196 1.1 riastrad } 5197 1.1 riastrad /* Must be an ATOMBIOS */ 5198 1.1 riastrad if (!rdev->is_atom_bios) { 5199 1.1 riastrad dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n"); 5200 1.1 riastrad return -EINVAL; 5201 1.1 riastrad } 5202 1.1 riastrad r = radeon_atombios_init(rdev); 5203 1.1 riastrad if (r) 5204 1.1 riastrad return r; 5205 1.1 riastrad /* reset the asic, the gfx blocks are often in a bad state 5206 1.1 riastrad * after the driver is unloaded or after a resume 5207 1.1 riastrad */ 5208 1.1 riastrad if (radeon_asic_reset(rdev)) 5209 1.1 riastrad dev_warn(rdev->dev, "GPU reset failed !\n"); 5210 1.1 riastrad /* Post card if necessary */ 5211 1.1 riastrad if (!radeon_card_posted(rdev)) { 5212 1.1 riastrad if (!rdev->bios) { 5213 1.1 riastrad dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 5214 1.1 riastrad return -EINVAL; 5215 1.1 riastrad } 5216 1.1 riastrad DRM_INFO("GPU not posted. posting now...\n"); 5217 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 5218 1.1 riastrad } 5219 1.1 riastrad /* init golden registers */ 5220 1.1 riastrad evergreen_init_golden_registers(rdev); 5221 1.1 riastrad /* Initialize scratch registers */ 5222 1.1 riastrad r600_scratch_init(rdev); 5223 1.1 riastrad /* Initialize surface registers */ 5224 1.1 riastrad radeon_surface_init(rdev); 5225 1.1 riastrad /* Initialize clocks */ 5226 1.1 riastrad radeon_get_clock_info(rdev->ddev); 5227 1.1 riastrad /* Fence driver */ 5228 1.1 riastrad r = radeon_fence_driver_init(rdev); 5229 1.1 riastrad if (r) 5230 1.1 riastrad return r; 5231 1.1 riastrad /* initialize AGP */ 5232 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 5233 1.1 riastrad r = radeon_agp_init(rdev); 5234 1.1 riastrad if (r) 5235 1.1 riastrad radeon_agp_disable(rdev); 5236 1.1 riastrad } 5237 1.1 riastrad /* initialize memory controller */ 5238 1.1 riastrad r = evergreen_mc_init(rdev); 5239 1.1 riastrad if (r) 5240 1.1 riastrad return r; 5241 1.1 riastrad /* Memory manager */ 5242 1.1 riastrad r = radeon_bo_init(rdev); 5243 1.1 riastrad if (r) 5244 1.1 riastrad return r; 5245 1.1 riastrad 5246 1.1 riastrad if (ASIC_IS_DCE5(rdev)) { 5247 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 5248 1.1 riastrad r = ni_init_microcode(rdev); 5249 1.1 riastrad if (r) { 5250 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 5251 1.1 riastrad return r; 5252 1.1 riastrad } 5253 1.1 riastrad } 5254 1.1 riastrad } else { 5255 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 5256 1.1 riastrad r = r600_init_microcode(rdev); 5257 1.1 riastrad if (r) { 5258 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 5259 1.1 riastrad return r; 5260 1.1 riastrad } 5261 1.1 riastrad } 5262 1.1 riastrad } 5263 1.1 riastrad 5264 1.1 riastrad /* Initialize power management */ 5265 1.1 riastrad radeon_pm_init(rdev); 5266 1.1 riastrad 5267 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 5268 1.1 riastrad r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 5269 1.1 riastrad 5270 1.1 riastrad rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL; 5271 1.1 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024); 5272 1.1 riastrad 5273 1.5 riastrad evergreen_uvd_init(rdev); 5274 1.1 riastrad 5275 1.1 riastrad rdev->ih.ring_obj = NULL; 5276 1.1 riastrad r600_ih_ring_init(rdev, 64 * 1024); 5277 1.1 riastrad 5278 1.1 riastrad r = r600_pcie_gart_init(rdev); 5279 1.1 riastrad if (r) 5280 1.1 riastrad return r; 5281 1.1 riastrad 5282 1.1 riastrad rdev->accel_working = true; 5283 1.1 riastrad r = evergreen_startup(rdev); 5284 1.1 riastrad if (r) { 5285 1.1 riastrad dev_err(rdev->dev, "disabling GPU acceleration\n"); 5286 1.1 riastrad r700_cp_fini(rdev); 5287 1.1 riastrad r600_dma_fini(rdev); 5288 1.1 riastrad r600_irq_fini(rdev); 5289 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 5290 1.1 riastrad sumo_rlc_fini(rdev); 5291 1.1 riastrad radeon_wb_fini(rdev); 5292 1.1 riastrad radeon_ib_pool_fini(rdev); 5293 1.1 riastrad radeon_irq_kms_fini(rdev); 5294 1.1 riastrad evergreen_pcie_gart_fini(rdev); 5295 1.1 riastrad rdev->accel_working = false; 5296 1.1 riastrad } 5297 1.1 riastrad 5298 1.1 riastrad /* Don't start up if the MC ucode is missing on BTC parts. 5299 1.1 riastrad * The default clocks and voltages before the MC ucode 5300 1.1 riastrad * is loaded are not suffient for advanced operations. 5301 1.1 riastrad */ 5302 1.1 riastrad if (ASIC_IS_DCE5(rdev)) { 5303 1.1 riastrad if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { 5304 1.1 riastrad DRM_ERROR("radeon: MC ucode required for NI+.\n"); 5305 1.1 riastrad return -EINVAL; 5306 1.1 riastrad } 5307 1.1 riastrad } 5308 1.1 riastrad 5309 1.1 riastrad return 0; 5310 1.1 riastrad } 5311 1.1 riastrad 5312 1.1 riastrad void evergreen_fini(struct radeon_device *rdev) 5313 1.1 riastrad { 5314 1.1 riastrad radeon_pm_fini(rdev); 5315 1.1 riastrad radeon_audio_fini(rdev); 5316 1.1 riastrad r700_cp_fini(rdev); 5317 1.1 riastrad r600_dma_fini(rdev); 5318 1.1 riastrad r600_irq_fini(rdev); 5319 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 5320 1.1 riastrad sumo_rlc_fini(rdev); 5321 1.1 riastrad radeon_wb_fini(rdev); 5322 1.1 riastrad radeon_ib_pool_fini(rdev); 5323 1.1 riastrad radeon_irq_kms_fini(rdev); 5324 1.1 riastrad uvd_v1_0_fini(rdev); 5325 1.1 riastrad radeon_uvd_fini(rdev); 5326 1.1 riastrad evergreen_pcie_gart_fini(rdev); 5327 1.1 riastrad r600_vram_scratch_fini(rdev); 5328 1.1 riastrad radeon_gem_fini(rdev); 5329 1.1 riastrad radeon_fence_driver_fini(rdev); 5330 1.1 riastrad radeon_agp_fini(rdev); 5331 1.1 riastrad radeon_bo_fini(rdev); 5332 1.1 riastrad radeon_atombios_fini(rdev); 5333 1.1 riastrad kfree(rdev->bios); 5334 1.1 riastrad rdev->bios = NULL; 5335 1.1 riastrad } 5336 1.1 riastrad 5337 1.1 riastrad void evergreen_pcie_gen2_enable(struct radeon_device *rdev) 5338 1.1 riastrad { 5339 1.1 riastrad u32 link_width_cntl, speed_cntl; 5340 1.1 riastrad 5341 1.1 riastrad if (radeon_pcie_gen2 == 0) 5342 1.1 riastrad return; 5343 1.1 riastrad 5344 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 5345 1.1 riastrad return; 5346 1.1 riastrad 5347 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 5348 1.1 riastrad return; 5349 1.1 riastrad 5350 1.1 riastrad /* x2 cards have a special sequence */ 5351 1.1 riastrad if (ASIC_IS_X2(rdev)) 5352 1.1 riastrad return; 5353 1.1 riastrad 5354 1.1 riastrad if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && 5355 1.1 riastrad (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) 5356 1.1 riastrad return; 5357 1.1 riastrad 5358 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 5359 1.1 riastrad if (speed_cntl & LC_CURRENT_DATA_RATE) { 5360 1.1 riastrad DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 5361 1.1 riastrad return; 5362 1.1 riastrad } 5363 1.1 riastrad 5364 1.1 riastrad DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); 5365 1.1 riastrad 5366 1.1 riastrad if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) || 5367 1.1 riastrad (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 5368 1.1 riastrad 5369 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 5370 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 5371 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 5372 1.1 riastrad 5373 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 5374 1.1 riastrad speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 5375 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 5376 1.1 riastrad 5377 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 5378 1.1 riastrad speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; 5379 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 5380 1.1 riastrad 5381 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 5382 1.1 riastrad speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; 5383 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 5384 1.1 riastrad 5385 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 5386 1.1 riastrad speed_cntl |= LC_GEN2_EN_STRAP; 5387 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 5388 1.1 riastrad 5389 1.1 riastrad } else { 5390 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 5391 1.1 riastrad /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 5392 1.1 riastrad if (1) 5393 1.1 riastrad link_width_cntl |= LC_UPCONFIGURE_DIS; 5394 1.1 riastrad else 5395 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 5396 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 5397 1.1 riastrad } 5398 1.1 riastrad } 5399 1.1 riastrad 5400 1.1 riastrad void evergreen_program_aspm(struct radeon_device *rdev) 5401 1.1 riastrad { 5402 1.1 riastrad u32 data, orig; 5403 1.1 riastrad u32 pcie_lc_cntl, pcie_lc_cntl_old; 5404 1.1 riastrad bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false; 5405 1.1 riastrad /* fusion_platform = true 5406 1.1 riastrad * if the system is a fusion system 5407 1.1 riastrad * (APU or DGPU in a fusion system). 5408 1.1 riastrad * todo: check if the system is a fusion platform. 5409 1.1 riastrad */ 5410 1.1 riastrad bool fusion_platform = false; 5411 1.1 riastrad 5412 1.1 riastrad if (radeon_aspm == 0) 5413 1.1 riastrad return; 5414 1.1 riastrad 5415 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 5416 1.1 riastrad return; 5417 1.1 riastrad 5418 1.1 riastrad switch (rdev->family) { 5419 1.1 riastrad case CHIP_CYPRESS: 5420 1.1 riastrad case CHIP_HEMLOCK: 5421 1.1 riastrad case CHIP_JUNIPER: 5422 1.1 riastrad case CHIP_REDWOOD: 5423 1.1 riastrad case CHIP_CEDAR: 5424 1.1 riastrad case CHIP_SUMO: 5425 1.1 riastrad case CHIP_SUMO2: 5426 1.1 riastrad case CHIP_PALM: 5427 1.1 riastrad case CHIP_ARUBA: 5428 1.1 riastrad disable_l0s = true; 5429 1.1 riastrad break; 5430 1.1 riastrad default: 5431 1.1 riastrad disable_l0s = false; 5432 1.1 riastrad break; 5433 1.1 riastrad } 5434 1.1 riastrad 5435 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 5436 1.1 riastrad fusion_platform = true; /* XXX also dGPUs in a fusion system */ 5437 1.1 riastrad 5438 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING); 5439 1.1 riastrad if (fusion_platform) 5440 1.1 riastrad data &= ~MULTI_PIF; 5441 1.1 riastrad else 5442 1.1 riastrad data |= MULTI_PIF; 5443 1.1 riastrad if (data != orig) 5444 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_PAIRING, data); 5445 1.1 riastrad 5446 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING); 5447 1.1 riastrad if (fusion_platform) 5448 1.1 riastrad data &= ~MULTI_PIF; 5449 1.1 riastrad else 5450 1.1 riastrad data |= MULTI_PIF; 5451 1.1 riastrad if (data != orig) 5452 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_PAIRING, data); 5453 1.1 riastrad 5454 1.1 riastrad pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL); 5455 1.1 riastrad pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK); 5456 1.1 riastrad if (!disable_l0s) { 5457 1.1 riastrad if (rdev->family >= CHIP_BARTS) 5458 1.1 riastrad pcie_lc_cntl |= LC_L0S_INACTIVITY(7); 5459 1.1 riastrad else 5460 1.1 riastrad pcie_lc_cntl |= LC_L0S_INACTIVITY(3); 5461 1.1 riastrad } 5462 1.1 riastrad 5463 1.1 riastrad if (!disable_l1) { 5464 1.1 riastrad if (rdev->family >= CHIP_BARTS) 5465 1.1 riastrad pcie_lc_cntl |= LC_L1_INACTIVITY(7); 5466 1.1 riastrad else 5467 1.1 riastrad pcie_lc_cntl |= LC_L1_INACTIVITY(8); 5468 1.1 riastrad 5469 1.1 riastrad if (!disable_plloff_in_l1) { 5470 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0); 5471 1.1 riastrad data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); 5472 1.1 riastrad data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); 5473 1.1 riastrad if (data != orig) 5474 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data); 5475 1.1 riastrad 5476 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1); 5477 1.1 riastrad data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); 5478 1.1 riastrad data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); 5479 1.1 riastrad if (data != orig) 5480 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data); 5481 1.1 riastrad 5482 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0); 5483 1.1 riastrad data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); 5484 1.1 riastrad data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); 5485 1.1 riastrad if (data != orig) 5486 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data); 5487 1.1 riastrad 5488 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1); 5489 1.1 riastrad data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); 5490 1.1 riastrad data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); 5491 1.1 riastrad if (data != orig) 5492 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data); 5493 1.1 riastrad 5494 1.1 riastrad if (rdev->family >= CHIP_BARTS) { 5495 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0); 5496 1.1 riastrad data &= ~PLL_RAMP_UP_TIME_0_MASK; 5497 1.1 riastrad data |= PLL_RAMP_UP_TIME_0(4); 5498 1.1 riastrad if (data != orig) 5499 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data); 5500 1.1 riastrad 5501 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1); 5502 1.1 riastrad data &= ~PLL_RAMP_UP_TIME_1_MASK; 5503 1.1 riastrad data |= PLL_RAMP_UP_TIME_1(4); 5504 1.1 riastrad if (data != orig) 5505 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data); 5506 1.1 riastrad 5507 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0); 5508 1.1 riastrad data &= ~PLL_RAMP_UP_TIME_0_MASK; 5509 1.1 riastrad data |= PLL_RAMP_UP_TIME_0(4); 5510 1.1 riastrad if (data != orig) 5511 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data); 5512 1.1 riastrad 5513 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1); 5514 1.1 riastrad data &= ~PLL_RAMP_UP_TIME_1_MASK; 5515 1.1 riastrad data |= PLL_RAMP_UP_TIME_1(4); 5516 1.1 riastrad if (data != orig) 5517 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data); 5518 1.1 riastrad } 5519 1.1 riastrad 5520 1.1 riastrad data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 5521 1.1 riastrad data &= ~LC_DYN_LANES_PWR_STATE_MASK; 5522 1.1 riastrad data |= LC_DYN_LANES_PWR_STATE(3); 5523 1.1 riastrad if (data != orig) 5524 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data); 5525 1.1 riastrad 5526 1.1 riastrad if (rdev->family >= CHIP_BARTS) { 5527 1.1 riastrad data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL); 5528 1.1 riastrad data &= ~LS2_EXIT_TIME_MASK; 5529 1.1 riastrad data |= LS2_EXIT_TIME(1); 5530 1.1 riastrad if (data != orig) 5531 1.1 riastrad WREG32_PIF_PHY0(PB0_PIF_CNTL, data); 5532 1.1 riastrad 5533 1.1 riastrad data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL); 5534 1.1 riastrad data &= ~LS2_EXIT_TIME_MASK; 5535 1.1 riastrad data |= LS2_EXIT_TIME(1); 5536 1.1 riastrad if (data != orig) 5537 1.1 riastrad WREG32_PIF_PHY1(PB1_PIF_CNTL, data); 5538 1.1 riastrad } 5539 1.1 riastrad } 5540 1.1 riastrad } 5541 1.1 riastrad 5542 1.1 riastrad /* evergreen parts only */ 5543 1.1 riastrad if (rdev->family < CHIP_BARTS) 5544 1.1 riastrad pcie_lc_cntl |= LC_PMI_TO_L1_DIS; 5545 1.1 riastrad 5546 1.1 riastrad if (pcie_lc_cntl != pcie_lc_cntl_old) 5547 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl); 5548 1.1 riastrad } 5549