1 1.7 mrg /* $NetBSD: radeon_r600.c,v 1.7 2023/09/30 10:46:45 mrg Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2008 Advanced Micro Devices, Inc. 5 1.1 riastrad * Copyright 2008 Red Hat Inc. 6 1.1 riastrad * Copyright 2009 Jerome Glisse. 7 1.1 riastrad * 8 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 9 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 10 1.1 riastrad * to deal in the Software without restriction, including without limitation 11 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 13 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 14 1.1 riastrad * 15 1.1 riastrad * The above copyright notice and this permission notice shall be included in 16 1.1 riastrad * all copies or substantial portions of the Software. 17 1.1 riastrad * 18 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 25 1.1 riastrad * 26 1.1 riastrad * Authors: Dave Airlie 27 1.1 riastrad * Alex Deucher 28 1.1 riastrad * Jerome Glisse 29 1.1 riastrad */ 30 1.6 riastrad 31 1.1 riastrad #include <sys/cdefs.h> 32 1.7 mrg __KERNEL_RCSID(0, "$NetBSD: radeon_r600.c,v 1.7 2023/09/30 10:46:45 mrg Exp $"); 33 1.1 riastrad 34 1.6 riastrad #include <linux/firmware.h> 35 1.6 riastrad #include <linux/module.h> 36 1.6 riastrad #include <linux/pci.h> 37 1.1 riastrad #include <linux/slab.h> 38 1.1 riastrad #include <linux/seq_file.h> 39 1.6 riastrad 40 1.6 riastrad #include <drm/drm_debugfs.h> 41 1.6 riastrad #include <drm/drm_device.h> 42 1.6 riastrad #include <drm/drm_vblank.h> 43 1.1 riastrad #include <drm/radeon_drm.h> 44 1.6 riastrad 45 1.6 riastrad #include "atom.h" 46 1.6 riastrad #include "avivod.h" 47 1.6 riastrad #include "r600d.h" 48 1.1 riastrad #include "radeon.h" 49 1.1 riastrad #include "radeon_asic.h" 50 1.1 riastrad #include "radeon_audio.h" 51 1.1 riastrad #include "radeon_mode.h" 52 1.1 riastrad #include "radeon_ucode.h" 53 1.1 riastrad 54 1.4 riastrad #include <linux/nbsd-namespace.h> 55 1.4 riastrad 56 1.1 riastrad /* Firmware Names */ 57 1.1 riastrad MODULE_FIRMWARE("radeon/R600_pfp.bin"); 58 1.1 riastrad MODULE_FIRMWARE("radeon/R600_me.bin"); 59 1.1 riastrad MODULE_FIRMWARE("radeon/RV610_pfp.bin"); 60 1.1 riastrad MODULE_FIRMWARE("radeon/RV610_me.bin"); 61 1.1 riastrad MODULE_FIRMWARE("radeon/RV630_pfp.bin"); 62 1.1 riastrad MODULE_FIRMWARE("radeon/RV630_me.bin"); 63 1.1 riastrad MODULE_FIRMWARE("radeon/RV620_pfp.bin"); 64 1.1 riastrad MODULE_FIRMWARE("radeon/RV620_me.bin"); 65 1.1 riastrad MODULE_FIRMWARE("radeon/RV635_pfp.bin"); 66 1.1 riastrad MODULE_FIRMWARE("radeon/RV635_me.bin"); 67 1.1 riastrad MODULE_FIRMWARE("radeon/RV670_pfp.bin"); 68 1.1 riastrad MODULE_FIRMWARE("radeon/RV670_me.bin"); 69 1.1 riastrad MODULE_FIRMWARE("radeon/RS780_pfp.bin"); 70 1.1 riastrad MODULE_FIRMWARE("radeon/RS780_me.bin"); 71 1.1 riastrad MODULE_FIRMWARE("radeon/RV770_pfp.bin"); 72 1.1 riastrad MODULE_FIRMWARE("radeon/RV770_me.bin"); 73 1.1 riastrad MODULE_FIRMWARE("radeon/RV770_smc.bin"); 74 1.1 riastrad MODULE_FIRMWARE("radeon/RV730_pfp.bin"); 75 1.1 riastrad MODULE_FIRMWARE("radeon/RV730_me.bin"); 76 1.1 riastrad MODULE_FIRMWARE("radeon/RV730_smc.bin"); 77 1.1 riastrad MODULE_FIRMWARE("radeon/RV740_smc.bin"); 78 1.1 riastrad MODULE_FIRMWARE("radeon/RV710_pfp.bin"); 79 1.1 riastrad MODULE_FIRMWARE("radeon/RV710_me.bin"); 80 1.1 riastrad MODULE_FIRMWARE("radeon/RV710_smc.bin"); 81 1.1 riastrad MODULE_FIRMWARE("radeon/R600_rlc.bin"); 82 1.1 riastrad MODULE_FIRMWARE("radeon/R700_rlc.bin"); 83 1.1 riastrad MODULE_FIRMWARE("radeon/CEDAR_pfp.bin"); 84 1.1 riastrad MODULE_FIRMWARE("radeon/CEDAR_me.bin"); 85 1.1 riastrad MODULE_FIRMWARE("radeon/CEDAR_rlc.bin"); 86 1.1 riastrad MODULE_FIRMWARE("radeon/CEDAR_smc.bin"); 87 1.1 riastrad MODULE_FIRMWARE("radeon/REDWOOD_pfp.bin"); 88 1.1 riastrad MODULE_FIRMWARE("radeon/REDWOOD_me.bin"); 89 1.1 riastrad MODULE_FIRMWARE("radeon/REDWOOD_rlc.bin"); 90 1.1 riastrad MODULE_FIRMWARE("radeon/REDWOOD_smc.bin"); 91 1.1 riastrad MODULE_FIRMWARE("radeon/JUNIPER_pfp.bin"); 92 1.1 riastrad MODULE_FIRMWARE("radeon/JUNIPER_me.bin"); 93 1.1 riastrad MODULE_FIRMWARE("radeon/JUNIPER_rlc.bin"); 94 1.1 riastrad MODULE_FIRMWARE("radeon/JUNIPER_smc.bin"); 95 1.1 riastrad MODULE_FIRMWARE("radeon/CYPRESS_pfp.bin"); 96 1.1 riastrad MODULE_FIRMWARE("radeon/CYPRESS_me.bin"); 97 1.1 riastrad MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin"); 98 1.1 riastrad MODULE_FIRMWARE("radeon/CYPRESS_smc.bin"); 99 1.1 riastrad MODULE_FIRMWARE("radeon/PALM_pfp.bin"); 100 1.1 riastrad MODULE_FIRMWARE("radeon/PALM_me.bin"); 101 1.1 riastrad MODULE_FIRMWARE("radeon/SUMO_rlc.bin"); 102 1.1 riastrad MODULE_FIRMWARE("radeon/SUMO_pfp.bin"); 103 1.1 riastrad MODULE_FIRMWARE("radeon/SUMO_me.bin"); 104 1.1 riastrad MODULE_FIRMWARE("radeon/SUMO2_pfp.bin"); 105 1.1 riastrad MODULE_FIRMWARE("radeon/SUMO2_me.bin"); 106 1.1 riastrad 107 1.1 riastrad static const u32 crtc_offsets[2] = 108 1.1 riastrad { 109 1.1 riastrad 0, 110 1.1 riastrad AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL 111 1.1 riastrad }; 112 1.1 riastrad 113 1.1 riastrad int r600_debugfs_mc_info_init(struct radeon_device *rdev); 114 1.1 riastrad 115 1.1 riastrad /* r600,rv610,rv630,rv620,rv635,rv670 */ 116 1.1 riastrad int r600_mc_wait_for_idle(struct radeon_device *rdev); 117 1.1 riastrad static void r600_gpu_init(struct radeon_device *rdev); 118 1.1 riastrad void r600_fini(struct radeon_device *rdev); 119 1.1 riastrad void r600_irq_disable(struct radeon_device *rdev); 120 1.1 riastrad static void r600_pcie_gen2_enable(struct radeon_device *rdev); 121 1.1 riastrad extern int evergreen_rlc_resume(struct radeon_device *rdev); 122 1.1 riastrad extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev); 123 1.1 riastrad 124 1.1 riastrad /* 125 1.1 riastrad * Indirect registers accessor 126 1.1 riastrad */ 127 1.1 riastrad u32 r600_rcu_rreg(struct radeon_device *rdev, u32 reg) 128 1.1 riastrad { 129 1.1 riastrad unsigned long flags; 130 1.1 riastrad u32 r; 131 1.1 riastrad 132 1.1 riastrad spin_lock_irqsave(&rdev->rcu_idx_lock, flags); 133 1.1 riastrad WREG32(R600_RCU_INDEX, ((reg) & 0x1fff)); 134 1.1 riastrad r = RREG32(R600_RCU_DATA); 135 1.1 riastrad spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags); 136 1.1 riastrad return r; 137 1.1 riastrad } 138 1.1 riastrad 139 1.1 riastrad void r600_rcu_wreg(struct radeon_device *rdev, u32 reg, u32 v) 140 1.1 riastrad { 141 1.1 riastrad unsigned long flags; 142 1.1 riastrad 143 1.1 riastrad spin_lock_irqsave(&rdev->rcu_idx_lock, flags); 144 1.1 riastrad WREG32(R600_RCU_INDEX, ((reg) & 0x1fff)); 145 1.1 riastrad WREG32(R600_RCU_DATA, (v)); 146 1.1 riastrad spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags); 147 1.1 riastrad } 148 1.1 riastrad 149 1.1 riastrad u32 r600_uvd_ctx_rreg(struct radeon_device *rdev, u32 reg) 150 1.1 riastrad { 151 1.1 riastrad unsigned long flags; 152 1.1 riastrad u32 r; 153 1.1 riastrad 154 1.1 riastrad spin_lock_irqsave(&rdev->uvd_idx_lock, flags); 155 1.1 riastrad WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff)); 156 1.1 riastrad r = RREG32(R600_UVD_CTX_DATA); 157 1.1 riastrad spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags); 158 1.1 riastrad return r; 159 1.1 riastrad } 160 1.1 riastrad 161 1.1 riastrad void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v) 162 1.1 riastrad { 163 1.1 riastrad unsigned long flags; 164 1.1 riastrad 165 1.1 riastrad spin_lock_irqsave(&rdev->uvd_idx_lock, flags); 166 1.1 riastrad WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff)); 167 1.1 riastrad WREG32(R600_UVD_CTX_DATA, (v)); 168 1.1 riastrad spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags); 169 1.1 riastrad } 170 1.1 riastrad 171 1.1 riastrad /** 172 1.1 riastrad * r600_get_allowed_info_register - fetch the register for the info ioctl 173 1.1 riastrad * 174 1.1 riastrad * @rdev: radeon_device pointer 175 1.1 riastrad * @reg: register offset in bytes 176 1.1 riastrad * @val: register value 177 1.1 riastrad * 178 1.1 riastrad * Returns 0 for success or -EINVAL for an invalid register 179 1.1 riastrad * 180 1.1 riastrad */ 181 1.1 riastrad int r600_get_allowed_info_register(struct radeon_device *rdev, 182 1.1 riastrad u32 reg, u32 *val) 183 1.1 riastrad { 184 1.1 riastrad switch (reg) { 185 1.1 riastrad case GRBM_STATUS: 186 1.1 riastrad case GRBM_STATUS2: 187 1.1 riastrad case R_000E50_SRBM_STATUS: 188 1.1 riastrad case DMA_STATUS_REG: 189 1.1 riastrad case UVD_STATUS: 190 1.1 riastrad *val = RREG32(reg); 191 1.1 riastrad return 0; 192 1.1 riastrad default: 193 1.1 riastrad return -EINVAL; 194 1.1 riastrad } 195 1.1 riastrad } 196 1.1 riastrad 197 1.1 riastrad /** 198 1.1 riastrad * r600_get_xclk - get the xclk 199 1.1 riastrad * 200 1.1 riastrad * @rdev: radeon_device pointer 201 1.1 riastrad * 202 1.1 riastrad * Returns the reference clock used by the gfx engine 203 1.1 riastrad * (r6xx, IGPs, APUs). 204 1.1 riastrad */ 205 1.1 riastrad u32 r600_get_xclk(struct radeon_device *rdev) 206 1.1 riastrad { 207 1.1 riastrad return rdev->clock.spll.reference_freq; 208 1.1 riastrad } 209 1.1 riastrad 210 1.1 riastrad int r600_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) 211 1.1 riastrad { 212 1.1 riastrad unsigned fb_div = 0, ref_div, vclk_div = 0, dclk_div = 0; 213 1.1 riastrad int r; 214 1.1 riastrad 215 1.1 riastrad /* bypass vclk and dclk with bclk */ 216 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 217 1.1 riastrad VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1), 218 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 219 1.1 riastrad 220 1.1 riastrad /* assert BYPASS_EN, deassert UPLL_RESET, UPLL_SLEEP and UPLL_CTLREQ */ 221 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~( 222 1.1 riastrad UPLL_RESET_MASK | UPLL_SLEEP_MASK | UPLL_CTLREQ_MASK)); 223 1.1 riastrad 224 1.1 riastrad if (rdev->family >= CHIP_RS780) 225 1.1 riastrad WREG32_P(GFX_MACRO_BYPASS_CNTL, UPLL_BYPASS_CNTL, 226 1.1 riastrad ~UPLL_BYPASS_CNTL); 227 1.1 riastrad 228 1.1 riastrad if (!vclk || !dclk) { 229 1.1 riastrad /* keep the Bypass mode, put PLL to sleep */ 230 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); 231 1.1 riastrad return 0; 232 1.1 riastrad } 233 1.1 riastrad 234 1.1 riastrad if (rdev->clock.spll.reference_freq == 10000) 235 1.1 riastrad ref_div = 34; 236 1.1 riastrad else 237 1.1 riastrad ref_div = 4; 238 1.1 riastrad 239 1.1 riastrad r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000, 240 1.1 riastrad ref_div + 1, 0xFFF, 2, 30, ~0, 241 1.1 riastrad &fb_div, &vclk_div, &dclk_div); 242 1.1 riastrad if (r) 243 1.1 riastrad return r; 244 1.1 riastrad 245 1.1 riastrad if (rdev->family >= CHIP_RV670 && rdev->family < CHIP_RS780) 246 1.1 riastrad fb_div >>= 1; 247 1.1 riastrad else 248 1.1 riastrad fb_div |= 1; 249 1.1 riastrad 250 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 251 1.6 riastrad if (r) 252 1.6 riastrad return r; 253 1.1 riastrad 254 1.1 riastrad /* assert PLL_RESET */ 255 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK); 256 1.1 riastrad 257 1.1 riastrad /* For RS780 we have to choose ref clk */ 258 1.1 riastrad if (rdev->family >= CHIP_RS780) 259 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REFCLK_SRC_SEL_MASK, 260 1.1 riastrad ~UPLL_REFCLK_SRC_SEL_MASK); 261 1.1 riastrad 262 1.1 riastrad /* set the required fb, ref and post divder values */ 263 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 264 1.1 riastrad UPLL_FB_DIV(fb_div) | 265 1.1 riastrad UPLL_REF_DIV(ref_div), 266 1.1 riastrad ~(UPLL_FB_DIV_MASK | UPLL_REF_DIV_MASK)); 267 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 268 1.1 riastrad UPLL_SW_HILEN(vclk_div >> 1) | 269 1.1 riastrad UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) | 270 1.1 riastrad UPLL_SW_HILEN2(dclk_div >> 1) | 271 1.1 riastrad UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)) | 272 1.1 riastrad UPLL_DIVEN_MASK | UPLL_DIVEN2_MASK, 273 1.1 riastrad ~UPLL_SW_MASK); 274 1.1 riastrad 275 1.1 riastrad /* give the PLL some time to settle */ 276 1.1 riastrad mdelay(15); 277 1.1 riastrad 278 1.1 riastrad /* deassert PLL_RESET */ 279 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK); 280 1.1 riastrad 281 1.1 riastrad mdelay(15); 282 1.1 riastrad 283 1.1 riastrad /* deassert BYPASS EN */ 284 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK); 285 1.1 riastrad 286 1.1 riastrad if (rdev->family >= CHIP_RS780) 287 1.1 riastrad WREG32_P(GFX_MACRO_BYPASS_CNTL, 0, ~UPLL_BYPASS_CNTL); 288 1.1 riastrad 289 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 290 1.1 riastrad if (r) 291 1.1 riastrad return r; 292 1.1 riastrad 293 1.1 riastrad /* switch VCLK and DCLK selection */ 294 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 295 1.1 riastrad VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2), 296 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 297 1.1 riastrad 298 1.1 riastrad mdelay(100); 299 1.1 riastrad 300 1.1 riastrad return 0; 301 1.1 riastrad } 302 1.1 riastrad 303 1.1 riastrad void dce3_program_fmt(struct drm_encoder *encoder) 304 1.1 riastrad { 305 1.1 riastrad struct drm_device *dev = encoder->dev; 306 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 307 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 308 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 309 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 310 1.1 riastrad int bpc = 0; 311 1.1 riastrad u32 tmp = 0; 312 1.1 riastrad enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE; 313 1.1 riastrad 314 1.1 riastrad if (connector) { 315 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 316 1.1 riastrad bpc = radeon_get_monitor_bpc(connector); 317 1.1 riastrad dither = radeon_connector->dither; 318 1.1 riastrad } 319 1.1 riastrad 320 1.1 riastrad /* LVDS FMT is set up by atom */ 321 1.1 riastrad if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT) 322 1.1 riastrad return; 323 1.1 riastrad 324 1.1 riastrad /* not needed for analog */ 325 1.1 riastrad if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) || 326 1.1 riastrad (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2)) 327 1.1 riastrad return; 328 1.1 riastrad 329 1.1 riastrad if (bpc == 0) 330 1.1 riastrad return; 331 1.1 riastrad 332 1.1 riastrad switch (bpc) { 333 1.1 riastrad case 6: 334 1.1 riastrad if (dither == RADEON_FMT_DITHER_ENABLE) 335 1.1 riastrad /* XXX sort out optimal dither settings */ 336 1.1 riastrad tmp |= FMT_SPATIAL_DITHER_EN; 337 1.1 riastrad else 338 1.1 riastrad tmp |= FMT_TRUNCATE_EN; 339 1.1 riastrad break; 340 1.1 riastrad case 8: 341 1.1 riastrad if (dither == RADEON_FMT_DITHER_ENABLE) 342 1.1 riastrad /* XXX sort out optimal dither settings */ 343 1.1 riastrad tmp |= (FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH); 344 1.1 riastrad else 345 1.1 riastrad tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH); 346 1.1 riastrad break; 347 1.1 riastrad case 10: 348 1.1 riastrad default: 349 1.1 riastrad /* not needed */ 350 1.1 riastrad break; 351 1.1 riastrad } 352 1.1 riastrad 353 1.1 riastrad WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp); 354 1.1 riastrad } 355 1.1 riastrad 356 1.1 riastrad /* get temperature in millidegrees */ 357 1.1 riastrad int rv6xx_get_temp(struct radeon_device *rdev) 358 1.1 riastrad { 359 1.1 riastrad u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> 360 1.1 riastrad ASIC_T_SHIFT; 361 1.1 riastrad int actual_temp = temp & 0xff; 362 1.1 riastrad 363 1.1 riastrad if (temp & 0x100) 364 1.1 riastrad actual_temp -= 256; 365 1.1 riastrad 366 1.1 riastrad return actual_temp * 1000; 367 1.1 riastrad } 368 1.1 riastrad 369 1.1 riastrad void r600_pm_get_dynpm_state(struct radeon_device *rdev) 370 1.1 riastrad { 371 1.1 riastrad int i; 372 1.1 riastrad 373 1.1 riastrad rdev->pm.dynpm_can_upclock = true; 374 1.1 riastrad rdev->pm.dynpm_can_downclock = true; 375 1.1 riastrad 376 1.1 riastrad /* power state array is low to high, default is first */ 377 1.1 riastrad if ((rdev->flags & RADEON_IS_IGP) || (rdev->family == CHIP_R600)) { 378 1.1 riastrad int min_power_state_index = 0; 379 1.1 riastrad 380 1.1 riastrad if (rdev->pm.num_power_states > 2) 381 1.1 riastrad min_power_state_index = 1; 382 1.1 riastrad 383 1.1 riastrad switch (rdev->pm.dynpm_planned_action) { 384 1.1 riastrad case DYNPM_ACTION_MINIMUM: 385 1.1 riastrad rdev->pm.requested_power_state_index = min_power_state_index; 386 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 387 1.1 riastrad rdev->pm.dynpm_can_downclock = false; 388 1.1 riastrad break; 389 1.1 riastrad case DYNPM_ACTION_DOWNCLOCK: 390 1.1 riastrad if (rdev->pm.current_power_state_index == min_power_state_index) { 391 1.1 riastrad rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index; 392 1.1 riastrad rdev->pm.dynpm_can_downclock = false; 393 1.1 riastrad } else { 394 1.1 riastrad if (rdev->pm.active_crtc_count > 1) { 395 1.1 riastrad for (i = 0; i < rdev->pm.num_power_states; i++) { 396 1.1 riastrad if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY) 397 1.1 riastrad continue; 398 1.1 riastrad else if (i >= rdev->pm.current_power_state_index) { 399 1.1 riastrad rdev->pm.requested_power_state_index = 400 1.1 riastrad rdev->pm.current_power_state_index; 401 1.1 riastrad break; 402 1.1 riastrad } else { 403 1.1 riastrad rdev->pm.requested_power_state_index = i; 404 1.1 riastrad break; 405 1.1 riastrad } 406 1.1 riastrad } 407 1.1 riastrad } else { 408 1.1 riastrad if (rdev->pm.current_power_state_index == 0) 409 1.1 riastrad rdev->pm.requested_power_state_index = 410 1.1 riastrad rdev->pm.num_power_states - 1; 411 1.1 riastrad else 412 1.1 riastrad rdev->pm.requested_power_state_index = 413 1.1 riastrad rdev->pm.current_power_state_index - 1; 414 1.1 riastrad } 415 1.1 riastrad } 416 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 417 1.1 riastrad /* don't use the power state if crtcs are active and no display flag is set */ 418 1.1 riastrad if ((rdev->pm.active_crtc_count > 0) && 419 1.1 riastrad (rdev->pm.power_state[rdev->pm.requested_power_state_index]. 420 1.1 riastrad clock_info[rdev->pm.requested_clock_mode_index].flags & 421 1.1 riastrad RADEON_PM_MODE_NO_DISPLAY)) { 422 1.1 riastrad rdev->pm.requested_power_state_index++; 423 1.1 riastrad } 424 1.1 riastrad break; 425 1.1 riastrad case DYNPM_ACTION_UPCLOCK: 426 1.1 riastrad if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) { 427 1.1 riastrad rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index; 428 1.1 riastrad rdev->pm.dynpm_can_upclock = false; 429 1.1 riastrad } else { 430 1.1 riastrad if (rdev->pm.active_crtc_count > 1) { 431 1.1 riastrad for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) { 432 1.1 riastrad if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY) 433 1.1 riastrad continue; 434 1.1 riastrad else if (i <= rdev->pm.current_power_state_index) { 435 1.1 riastrad rdev->pm.requested_power_state_index = 436 1.1 riastrad rdev->pm.current_power_state_index; 437 1.1 riastrad break; 438 1.1 riastrad } else { 439 1.1 riastrad rdev->pm.requested_power_state_index = i; 440 1.1 riastrad break; 441 1.1 riastrad } 442 1.1 riastrad } 443 1.1 riastrad } else 444 1.1 riastrad rdev->pm.requested_power_state_index = 445 1.1 riastrad rdev->pm.current_power_state_index + 1; 446 1.1 riastrad } 447 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 448 1.1 riastrad break; 449 1.1 riastrad case DYNPM_ACTION_DEFAULT: 450 1.1 riastrad rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index; 451 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 452 1.1 riastrad rdev->pm.dynpm_can_upclock = false; 453 1.1 riastrad break; 454 1.1 riastrad case DYNPM_ACTION_NONE: 455 1.1 riastrad default: 456 1.1 riastrad DRM_ERROR("Requested mode for not defined action\n"); 457 1.1 riastrad return; 458 1.1 riastrad } 459 1.1 riastrad } else { 460 1.1 riastrad /* XXX select a power state based on AC/DC, single/dualhead, etc. */ 461 1.1 riastrad /* for now just select the first power state and switch between clock modes */ 462 1.1 riastrad /* power state array is low to high, default is first (0) */ 463 1.1 riastrad if (rdev->pm.active_crtc_count > 1) { 464 1.1 riastrad rdev->pm.requested_power_state_index = -1; 465 1.1 riastrad /* start at 1 as we don't want the default mode */ 466 1.1 riastrad for (i = 1; i < rdev->pm.num_power_states; i++) { 467 1.1 riastrad if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY) 468 1.1 riastrad continue; 469 1.1 riastrad else if ((rdev->pm.power_state[i].type == POWER_STATE_TYPE_PERFORMANCE) || 470 1.1 riastrad (rdev->pm.power_state[i].type == POWER_STATE_TYPE_BATTERY)) { 471 1.1 riastrad rdev->pm.requested_power_state_index = i; 472 1.1 riastrad break; 473 1.1 riastrad } 474 1.1 riastrad } 475 1.1 riastrad /* if nothing selected, grab the default state. */ 476 1.1 riastrad if (rdev->pm.requested_power_state_index == -1) 477 1.1 riastrad rdev->pm.requested_power_state_index = 0; 478 1.1 riastrad } else 479 1.1 riastrad rdev->pm.requested_power_state_index = 1; 480 1.1 riastrad 481 1.1 riastrad switch (rdev->pm.dynpm_planned_action) { 482 1.1 riastrad case DYNPM_ACTION_MINIMUM: 483 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 484 1.1 riastrad rdev->pm.dynpm_can_downclock = false; 485 1.1 riastrad break; 486 1.1 riastrad case DYNPM_ACTION_DOWNCLOCK: 487 1.1 riastrad if (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index) { 488 1.1 riastrad if (rdev->pm.current_clock_mode_index == 0) { 489 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 490 1.1 riastrad rdev->pm.dynpm_can_downclock = false; 491 1.1 riastrad } else 492 1.1 riastrad rdev->pm.requested_clock_mode_index = 493 1.1 riastrad rdev->pm.current_clock_mode_index - 1; 494 1.1 riastrad } else { 495 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 496 1.1 riastrad rdev->pm.dynpm_can_downclock = false; 497 1.1 riastrad } 498 1.1 riastrad /* don't use the power state if crtcs are active and no display flag is set */ 499 1.1 riastrad if ((rdev->pm.active_crtc_count > 0) && 500 1.1 riastrad (rdev->pm.power_state[rdev->pm.requested_power_state_index]. 501 1.1 riastrad clock_info[rdev->pm.requested_clock_mode_index].flags & 502 1.1 riastrad RADEON_PM_MODE_NO_DISPLAY)) { 503 1.1 riastrad rdev->pm.requested_clock_mode_index++; 504 1.1 riastrad } 505 1.1 riastrad break; 506 1.1 riastrad case DYNPM_ACTION_UPCLOCK: 507 1.1 riastrad if (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index) { 508 1.1 riastrad if (rdev->pm.current_clock_mode_index == 509 1.1 riastrad (rdev->pm.power_state[rdev->pm.requested_power_state_index].num_clock_modes - 1)) { 510 1.1 riastrad rdev->pm.requested_clock_mode_index = rdev->pm.current_clock_mode_index; 511 1.1 riastrad rdev->pm.dynpm_can_upclock = false; 512 1.1 riastrad } else 513 1.1 riastrad rdev->pm.requested_clock_mode_index = 514 1.1 riastrad rdev->pm.current_clock_mode_index + 1; 515 1.1 riastrad } else { 516 1.1 riastrad rdev->pm.requested_clock_mode_index = 517 1.1 riastrad rdev->pm.power_state[rdev->pm.requested_power_state_index].num_clock_modes - 1; 518 1.1 riastrad rdev->pm.dynpm_can_upclock = false; 519 1.1 riastrad } 520 1.1 riastrad break; 521 1.1 riastrad case DYNPM_ACTION_DEFAULT: 522 1.1 riastrad rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index; 523 1.1 riastrad rdev->pm.requested_clock_mode_index = 0; 524 1.1 riastrad rdev->pm.dynpm_can_upclock = false; 525 1.1 riastrad break; 526 1.1 riastrad case DYNPM_ACTION_NONE: 527 1.1 riastrad default: 528 1.1 riastrad DRM_ERROR("Requested mode for not defined action\n"); 529 1.1 riastrad return; 530 1.1 riastrad } 531 1.1 riastrad } 532 1.1 riastrad 533 1.1 riastrad DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n", 534 1.1 riastrad rdev->pm.power_state[rdev->pm.requested_power_state_index]. 535 1.1 riastrad clock_info[rdev->pm.requested_clock_mode_index].sclk, 536 1.1 riastrad rdev->pm.power_state[rdev->pm.requested_power_state_index]. 537 1.1 riastrad clock_info[rdev->pm.requested_clock_mode_index].mclk, 538 1.1 riastrad rdev->pm.power_state[rdev->pm.requested_power_state_index]. 539 1.1 riastrad pcie_lanes); 540 1.1 riastrad } 541 1.1 riastrad 542 1.1 riastrad void rs780_pm_init_profile(struct radeon_device *rdev) 543 1.1 riastrad { 544 1.1 riastrad if (rdev->pm.num_power_states == 2) { 545 1.1 riastrad /* default */ 546 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 547 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 548 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 549 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 550 1.1 riastrad /* low sh */ 551 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 0; 552 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 0; 553 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 554 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 555 1.1 riastrad /* mid sh */ 556 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 0; 557 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 0; 558 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 559 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0; 560 1.1 riastrad /* high sh */ 561 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 0; 562 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 1; 563 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 564 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0; 565 1.1 riastrad /* low mh */ 566 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 0; 567 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 0; 568 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 569 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 570 1.1 riastrad /* mid mh */ 571 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 0; 572 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 0; 573 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 574 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 575 1.1 riastrad /* high mh */ 576 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0; 577 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 1; 578 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 579 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 580 1.1 riastrad } else if (rdev->pm.num_power_states == 3) { 581 1.1 riastrad /* default */ 582 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 583 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 584 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 585 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 586 1.1 riastrad /* low sh */ 587 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 1; 588 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 1; 589 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 590 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 591 1.1 riastrad /* mid sh */ 592 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 1; 593 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 1; 594 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 595 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0; 596 1.1 riastrad /* high sh */ 597 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 1; 598 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 2; 599 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 600 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0; 601 1.1 riastrad /* low mh */ 602 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 1; 603 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 1; 604 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 605 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 606 1.1 riastrad /* mid mh */ 607 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 1; 608 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 1; 609 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 610 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 611 1.1 riastrad /* high mh */ 612 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 1; 613 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 2; 614 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 615 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 616 1.1 riastrad } else { 617 1.1 riastrad /* default */ 618 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 619 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 620 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 621 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 622 1.1 riastrad /* low sh */ 623 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 2; 624 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 2; 625 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 626 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 627 1.1 riastrad /* mid sh */ 628 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 2; 629 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 2; 630 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 631 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0; 632 1.1 riastrad /* high sh */ 633 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 2; 634 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 3; 635 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 636 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0; 637 1.1 riastrad /* low mh */ 638 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 2; 639 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 0; 640 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 641 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 642 1.1 riastrad /* mid mh */ 643 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 2; 644 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 0; 645 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 646 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 647 1.1 riastrad /* high mh */ 648 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 2; 649 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 3; 650 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 651 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 652 1.1 riastrad } 653 1.1 riastrad } 654 1.1 riastrad 655 1.1 riastrad void r600_pm_init_profile(struct radeon_device *rdev) 656 1.1 riastrad { 657 1.1 riastrad int idx; 658 1.1 riastrad 659 1.1 riastrad if (rdev->family == CHIP_R600) { 660 1.1 riastrad /* XXX */ 661 1.1 riastrad /* default */ 662 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 663 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 664 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 665 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 666 1.1 riastrad /* low sh */ 667 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 668 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 669 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 670 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 671 1.1 riastrad /* mid sh */ 672 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 673 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 674 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 675 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0; 676 1.1 riastrad /* high sh */ 677 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 678 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 679 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 680 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0; 681 1.1 riastrad /* low mh */ 682 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 683 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 684 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 685 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 686 1.1 riastrad /* mid mh */ 687 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 688 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 689 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 690 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 691 1.1 riastrad /* high mh */ 692 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 693 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 694 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 695 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 696 1.1 riastrad } else { 697 1.1 riastrad if (rdev->pm.num_power_states < 4) { 698 1.1 riastrad /* default */ 699 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 700 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 701 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 702 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2; 703 1.1 riastrad /* low sh */ 704 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 1; 705 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 1; 706 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 707 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 708 1.1 riastrad /* mid sh */ 709 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 1; 710 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 1; 711 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 712 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1; 713 1.1 riastrad /* high sh */ 714 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 1; 715 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 1; 716 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 717 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2; 718 1.1 riastrad /* low mh */ 719 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 2; 720 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 2; 721 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 722 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 723 1.1 riastrad /* low mh */ 724 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 2; 725 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 2; 726 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 727 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1; 728 1.1 riastrad /* high mh */ 729 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 2; 730 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 2; 731 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 732 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2; 733 1.1 riastrad } else { 734 1.1 riastrad /* default */ 735 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 736 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 737 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 738 1.1 riastrad rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2; 739 1.1 riastrad /* low sh */ 740 1.1 riastrad if (rdev->flags & RADEON_IS_MOBILITY) 741 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0); 742 1.1 riastrad else 743 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0); 744 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx; 745 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx; 746 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0; 747 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0; 748 1.1 riastrad /* mid sh */ 749 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx; 750 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx; 751 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0; 752 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1; 753 1.1 riastrad /* high sh */ 754 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0); 755 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx; 756 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx; 757 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0; 758 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2; 759 1.1 riastrad /* low mh */ 760 1.1 riastrad if (rdev->flags & RADEON_IS_MOBILITY) 761 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 1); 762 1.1 riastrad else 763 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 1); 764 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx; 765 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx; 766 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0; 767 1.1 riastrad rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0; 768 1.1 riastrad /* mid mh */ 769 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx; 770 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx; 771 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0; 772 1.1 riastrad rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1; 773 1.1 riastrad /* high mh */ 774 1.1 riastrad idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 1); 775 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx; 776 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx; 777 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 778 1.1 riastrad rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2; 779 1.1 riastrad } 780 1.1 riastrad } 781 1.1 riastrad } 782 1.1 riastrad 783 1.1 riastrad void r600_pm_misc(struct radeon_device *rdev) 784 1.1 riastrad { 785 1.1 riastrad int req_ps_idx = rdev->pm.requested_power_state_index; 786 1.1 riastrad int req_cm_idx = rdev->pm.requested_clock_mode_index; 787 1.1 riastrad struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; 788 1.1 riastrad struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 789 1.1 riastrad 790 1.1 riastrad if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 791 1.1 riastrad /* 0xff01 is a flag rather then an actual voltage */ 792 1.1 riastrad if (voltage->voltage == 0xff01) 793 1.1 riastrad return; 794 1.1 riastrad if (voltage->voltage != rdev->pm.current_vddc) { 795 1.1 riastrad radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); 796 1.1 riastrad rdev->pm.current_vddc = voltage->voltage; 797 1.1 riastrad DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); 798 1.1 riastrad } 799 1.1 riastrad } 800 1.1 riastrad } 801 1.1 riastrad 802 1.1 riastrad bool r600_gui_idle(struct radeon_device *rdev) 803 1.1 riastrad { 804 1.1 riastrad if (RREG32(GRBM_STATUS) & GUI_ACTIVE) 805 1.1 riastrad return false; 806 1.1 riastrad else 807 1.1 riastrad return true; 808 1.1 riastrad } 809 1.1 riastrad 810 1.1 riastrad /* hpd for digital panel detect/disconnect */ 811 1.1 riastrad bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) 812 1.1 riastrad { 813 1.1 riastrad bool connected = false; 814 1.1 riastrad 815 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 816 1.1 riastrad switch (hpd) { 817 1.1 riastrad case RADEON_HPD_1: 818 1.1 riastrad if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE) 819 1.1 riastrad connected = true; 820 1.1 riastrad break; 821 1.1 riastrad case RADEON_HPD_2: 822 1.1 riastrad if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE) 823 1.1 riastrad connected = true; 824 1.1 riastrad break; 825 1.1 riastrad case RADEON_HPD_3: 826 1.1 riastrad if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE) 827 1.1 riastrad connected = true; 828 1.1 riastrad break; 829 1.1 riastrad case RADEON_HPD_4: 830 1.1 riastrad if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE) 831 1.1 riastrad connected = true; 832 1.1 riastrad break; 833 1.1 riastrad /* DCE 3.2 */ 834 1.1 riastrad case RADEON_HPD_5: 835 1.1 riastrad if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE) 836 1.1 riastrad connected = true; 837 1.1 riastrad break; 838 1.1 riastrad case RADEON_HPD_6: 839 1.1 riastrad if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE) 840 1.1 riastrad connected = true; 841 1.1 riastrad break; 842 1.1 riastrad default: 843 1.1 riastrad break; 844 1.1 riastrad } 845 1.1 riastrad } else { 846 1.1 riastrad switch (hpd) { 847 1.1 riastrad case RADEON_HPD_1: 848 1.1 riastrad if (RREG32(DC_HOT_PLUG_DETECT1_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE) 849 1.1 riastrad connected = true; 850 1.1 riastrad break; 851 1.1 riastrad case RADEON_HPD_2: 852 1.1 riastrad if (RREG32(DC_HOT_PLUG_DETECT2_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE) 853 1.1 riastrad connected = true; 854 1.1 riastrad break; 855 1.1 riastrad case RADEON_HPD_3: 856 1.1 riastrad if (RREG32(DC_HOT_PLUG_DETECT3_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE) 857 1.1 riastrad connected = true; 858 1.1 riastrad break; 859 1.1 riastrad default: 860 1.1 riastrad break; 861 1.1 riastrad } 862 1.1 riastrad } 863 1.1 riastrad return connected; 864 1.1 riastrad } 865 1.1 riastrad 866 1.1 riastrad void r600_hpd_set_polarity(struct radeon_device *rdev, 867 1.1 riastrad enum radeon_hpd_id hpd) 868 1.1 riastrad { 869 1.1 riastrad u32 tmp; 870 1.1 riastrad bool connected = r600_hpd_sense(rdev, hpd); 871 1.1 riastrad 872 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 873 1.1 riastrad switch (hpd) { 874 1.1 riastrad case RADEON_HPD_1: 875 1.1 riastrad tmp = RREG32(DC_HPD1_INT_CONTROL); 876 1.1 riastrad if (connected) 877 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 878 1.1 riastrad else 879 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 880 1.1 riastrad WREG32(DC_HPD1_INT_CONTROL, tmp); 881 1.1 riastrad break; 882 1.1 riastrad case RADEON_HPD_2: 883 1.1 riastrad tmp = RREG32(DC_HPD2_INT_CONTROL); 884 1.1 riastrad if (connected) 885 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 886 1.1 riastrad else 887 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 888 1.1 riastrad WREG32(DC_HPD2_INT_CONTROL, tmp); 889 1.1 riastrad break; 890 1.1 riastrad case RADEON_HPD_3: 891 1.1 riastrad tmp = RREG32(DC_HPD3_INT_CONTROL); 892 1.1 riastrad if (connected) 893 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 894 1.1 riastrad else 895 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 896 1.1 riastrad WREG32(DC_HPD3_INT_CONTROL, tmp); 897 1.1 riastrad break; 898 1.1 riastrad case RADEON_HPD_4: 899 1.1 riastrad tmp = RREG32(DC_HPD4_INT_CONTROL); 900 1.1 riastrad if (connected) 901 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 902 1.1 riastrad else 903 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 904 1.1 riastrad WREG32(DC_HPD4_INT_CONTROL, tmp); 905 1.1 riastrad break; 906 1.1 riastrad case RADEON_HPD_5: 907 1.1 riastrad tmp = RREG32(DC_HPD5_INT_CONTROL); 908 1.1 riastrad if (connected) 909 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 910 1.1 riastrad else 911 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 912 1.1 riastrad WREG32(DC_HPD5_INT_CONTROL, tmp); 913 1.1 riastrad break; 914 1.1 riastrad /* DCE 3.2 */ 915 1.1 riastrad case RADEON_HPD_6: 916 1.1 riastrad tmp = RREG32(DC_HPD6_INT_CONTROL); 917 1.1 riastrad if (connected) 918 1.1 riastrad tmp &= ~DC_HPDx_INT_POLARITY; 919 1.1 riastrad else 920 1.1 riastrad tmp |= DC_HPDx_INT_POLARITY; 921 1.1 riastrad WREG32(DC_HPD6_INT_CONTROL, tmp); 922 1.1 riastrad break; 923 1.1 riastrad default: 924 1.1 riastrad break; 925 1.1 riastrad } 926 1.1 riastrad } else { 927 1.1 riastrad switch (hpd) { 928 1.1 riastrad case RADEON_HPD_1: 929 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL); 930 1.1 riastrad if (connected) 931 1.1 riastrad tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY; 932 1.1 riastrad else 933 1.1 riastrad tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY; 934 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp); 935 1.1 riastrad break; 936 1.1 riastrad case RADEON_HPD_2: 937 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL); 938 1.1 riastrad if (connected) 939 1.1 riastrad tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY; 940 1.1 riastrad else 941 1.1 riastrad tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY; 942 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp); 943 1.1 riastrad break; 944 1.1 riastrad case RADEON_HPD_3: 945 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL); 946 1.1 riastrad if (connected) 947 1.1 riastrad tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY; 948 1.1 riastrad else 949 1.1 riastrad tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY; 950 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp); 951 1.1 riastrad break; 952 1.1 riastrad default: 953 1.1 riastrad break; 954 1.1 riastrad } 955 1.1 riastrad } 956 1.1 riastrad } 957 1.1 riastrad 958 1.1 riastrad void r600_hpd_init(struct radeon_device *rdev) 959 1.1 riastrad { 960 1.1 riastrad struct drm_device *dev = rdev->ddev; 961 1.1 riastrad struct drm_connector *connector; 962 1.1 riastrad unsigned enable = 0; 963 1.1 riastrad 964 1.1 riastrad list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 965 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 966 1.1 riastrad 967 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 968 1.1 riastrad connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { 969 1.1 riastrad /* don't try to enable hpd on eDP or LVDS avoid breaking the 970 1.1 riastrad * aux dp channel on imac and help (but not completely fix) 971 1.1 riastrad * https://bugzilla.redhat.com/show_bug.cgi?id=726143 972 1.1 riastrad */ 973 1.1 riastrad continue; 974 1.1 riastrad } 975 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 976 1.1 riastrad u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | DC_HPDx_RX_INT_TIMER(0xfa); 977 1.1 riastrad if (ASIC_IS_DCE32(rdev)) 978 1.1 riastrad tmp |= DC_HPDx_EN; 979 1.1 riastrad 980 1.1 riastrad switch (radeon_connector->hpd.hpd) { 981 1.1 riastrad case RADEON_HPD_1: 982 1.1 riastrad WREG32(DC_HPD1_CONTROL, tmp); 983 1.1 riastrad break; 984 1.1 riastrad case RADEON_HPD_2: 985 1.1 riastrad WREG32(DC_HPD2_CONTROL, tmp); 986 1.1 riastrad break; 987 1.1 riastrad case RADEON_HPD_3: 988 1.1 riastrad WREG32(DC_HPD3_CONTROL, tmp); 989 1.1 riastrad break; 990 1.1 riastrad case RADEON_HPD_4: 991 1.1 riastrad WREG32(DC_HPD4_CONTROL, tmp); 992 1.1 riastrad break; 993 1.1 riastrad /* DCE 3.2 */ 994 1.1 riastrad case RADEON_HPD_5: 995 1.1 riastrad WREG32(DC_HPD5_CONTROL, tmp); 996 1.1 riastrad break; 997 1.1 riastrad case RADEON_HPD_6: 998 1.1 riastrad WREG32(DC_HPD6_CONTROL, tmp); 999 1.1 riastrad break; 1000 1.1 riastrad default: 1001 1.1 riastrad break; 1002 1.1 riastrad } 1003 1.1 riastrad } else { 1004 1.1 riastrad switch (radeon_connector->hpd.hpd) { 1005 1.1 riastrad case RADEON_HPD_1: 1006 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_CONTROL, DC_HOT_PLUG_DETECTx_EN); 1007 1.1 riastrad break; 1008 1.1 riastrad case RADEON_HPD_2: 1009 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_CONTROL, DC_HOT_PLUG_DETECTx_EN); 1010 1.1 riastrad break; 1011 1.1 riastrad case RADEON_HPD_3: 1012 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_CONTROL, DC_HOT_PLUG_DETECTx_EN); 1013 1.1 riastrad break; 1014 1.1 riastrad default: 1015 1.1 riastrad break; 1016 1.1 riastrad } 1017 1.1 riastrad } 1018 1.3 msaitoh if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) 1019 1.3 msaitoh enable |= 1 << radeon_connector->hpd.hpd; 1020 1.1 riastrad radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 1021 1.1 riastrad } 1022 1.1 riastrad radeon_irq_kms_enable_hpd(rdev, enable); 1023 1.1 riastrad } 1024 1.1 riastrad 1025 1.1 riastrad void r600_hpd_fini(struct radeon_device *rdev) 1026 1.1 riastrad { 1027 1.1 riastrad struct drm_device *dev = rdev->ddev; 1028 1.1 riastrad struct drm_connector *connector; 1029 1.1 riastrad unsigned disable = 0; 1030 1.1 riastrad 1031 1.1 riastrad list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1032 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1033 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 1034 1.1 riastrad switch (radeon_connector->hpd.hpd) { 1035 1.1 riastrad case RADEON_HPD_1: 1036 1.1 riastrad WREG32(DC_HPD1_CONTROL, 0); 1037 1.1 riastrad break; 1038 1.1 riastrad case RADEON_HPD_2: 1039 1.1 riastrad WREG32(DC_HPD2_CONTROL, 0); 1040 1.1 riastrad break; 1041 1.1 riastrad case RADEON_HPD_3: 1042 1.1 riastrad WREG32(DC_HPD3_CONTROL, 0); 1043 1.1 riastrad break; 1044 1.1 riastrad case RADEON_HPD_4: 1045 1.1 riastrad WREG32(DC_HPD4_CONTROL, 0); 1046 1.1 riastrad break; 1047 1.1 riastrad /* DCE 3.2 */ 1048 1.1 riastrad case RADEON_HPD_5: 1049 1.1 riastrad WREG32(DC_HPD5_CONTROL, 0); 1050 1.1 riastrad break; 1051 1.1 riastrad case RADEON_HPD_6: 1052 1.1 riastrad WREG32(DC_HPD6_CONTROL, 0); 1053 1.1 riastrad break; 1054 1.1 riastrad default: 1055 1.1 riastrad break; 1056 1.1 riastrad } 1057 1.1 riastrad } else { 1058 1.1 riastrad switch (radeon_connector->hpd.hpd) { 1059 1.1 riastrad case RADEON_HPD_1: 1060 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_CONTROL, 0); 1061 1.1 riastrad break; 1062 1.1 riastrad case RADEON_HPD_2: 1063 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_CONTROL, 0); 1064 1.1 riastrad break; 1065 1.1 riastrad case RADEON_HPD_3: 1066 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_CONTROL, 0); 1067 1.1 riastrad break; 1068 1.1 riastrad default: 1069 1.1 riastrad break; 1070 1.1 riastrad } 1071 1.1 riastrad } 1072 1.6 riastrad if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) 1073 1.6 riastrad disable |= 1 << radeon_connector->hpd.hpd; 1074 1.1 riastrad } 1075 1.1 riastrad radeon_irq_kms_disable_hpd(rdev, disable); 1076 1.1 riastrad } 1077 1.1 riastrad 1078 1.1 riastrad #ifdef __NetBSD__ 1079 1.1 riastrad /* 1080 1.1 riastrad * XXX Can't use bus_space here because this is all mapped through the 1081 1.1 riastrad * radeon_bo abstraction. Can't assume we're x86 because this is 1082 1.1 riastrad * AMD/ATI Radeon, not Intel. 1083 1.1 riastrad */ 1084 1.1 riastrad 1085 1.1 riastrad # define __iomem volatile 1086 1.1 riastrad # define readl fake_readl 1087 1.1 riastrad 1088 1.1 riastrad static inline uint32_t 1089 1.1 riastrad fake_readl(const void __iomem *ptr) 1090 1.1 riastrad { 1091 1.1 riastrad uint32_t v; 1092 1.1 riastrad 1093 1.1 riastrad v = *(const uint32_t __iomem *)ptr; 1094 1.1 riastrad membar_consumer(); 1095 1.1 riastrad 1096 1.1 riastrad return v; 1097 1.1 riastrad } 1098 1.1 riastrad #endif 1099 1.1 riastrad 1100 1.1 riastrad /* 1101 1.1 riastrad * R600 PCIE GART 1102 1.1 riastrad */ 1103 1.1 riastrad void r600_pcie_gart_tlb_flush(struct radeon_device *rdev) 1104 1.1 riastrad { 1105 1.1 riastrad unsigned i; 1106 1.1 riastrad u32 tmp; 1107 1.1 riastrad 1108 1.1 riastrad /* flush hdp cache so updates hit vram */ 1109 1.1 riastrad if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && 1110 1.1 riastrad !(rdev->flags & RADEON_IS_AGP)) { 1111 1.1 riastrad void __iomem *ptr = rdev->gart.ptr; 1112 1.1 riastrad 1113 1.1 riastrad /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read 1114 1.1 riastrad * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL 1115 1.1 riastrad * This seems to cause problems on some AGP cards. Just use the old 1116 1.1 riastrad * method for them. 1117 1.1 riastrad */ 1118 1.1 riastrad WREG32(HDP_DEBUG1, 0); 1119 1.1 riastrad (void)readl(ptr); 1120 1.1 riastrad } else 1121 1.1 riastrad WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 1122 1.1 riastrad 1123 1.1 riastrad WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12); 1124 1.1 riastrad WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12); 1125 1.1 riastrad WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1)); 1126 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 1127 1.1 riastrad /* read MC_STATUS */ 1128 1.1 riastrad tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE); 1129 1.1 riastrad tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT; 1130 1.1 riastrad if (tmp == 2) { 1131 1.6 riastrad pr_warn("[drm] r600 flush TLB failed\n"); 1132 1.1 riastrad return; 1133 1.1 riastrad } 1134 1.1 riastrad if (tmp) { 1135 1.1 riastrad return; 1136 1.1 riastrad } 1137 1.1 riastrad udelay(1); 1138 1.1 riastrad } 1139 1.1 riastrad } 1140 1.1 riastrad 1141 1.1 riastrad #ifdef __NetBSD__ 1142 1.1 riastrad # undef __iomem 1143 1.1 riastrad # undef readl 1144 1.1 riastrad #endif 1145 1.1 riastrad 1146 1.1 riastrad int r600_pcie_gart_init(struct radeon_device *rdev) 1147 1.1 riastrad { 1148 1.1 riastrad int r; 1149 1.1 riastrad 1150 1.1 riastrad if (rdev->gart.robj) { 1151 1.1 riastrad WARN(1, "R600 PCIE GART already initialized\n"); 1152 1.1 riastrad return 0; 1153 1.1 riastrad } 1154 1.1 riastrad /* Initialize common gart structure */ 1155 1.1 riastrad r = radeon_gart_init(rdev); 1156 1.1 riastrad if (r) 1157 1.1 riastrad return r; 1158 1.1 riastrad rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; 1159 1.1 riastrad return radeon_gart_table_vram_alloc(rdev); 1160 1.1 riastrad } 1161 1.1 riastrad 1162 1.1 riastrad static int r600_pcie_gart_enable(struct radeon_device *rdev) 1163 1.1 riastrad { 1164 1.1 riastrad u32 tmp; 1165 1.1 riastrad int r, i; 1166 1.1 riastrad 1167 1.1 riastrad if (rdev->gart.robj == NULL) { 1168 1.1 riastrad dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 1169 1.1 riastrad return -EINVAL; 1170 1.1 riastrad } 1171 1.1 riastrad r = radeon_gart_table_vram_pin(rdev); 1172 1.1 riastrad if (r) 1173 1.1 riastrad return r; 1174 1.1 riastrad 1175 1.1 riastrad /* Setup L2 cache */ 1176 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 1177 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1178 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 1179 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 1180 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); 1181 1.1 riastrad /* Setup TLB control */ 1182 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 1183 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1184 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | 1185 1.1 riastrad ENABLE_WAIT_L2_QUERY; 1186 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); 1187 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); 1188 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING); 1189 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); 1190 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); 1191 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); 1192 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); 1193 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); 1194 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); 1195 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); 1196 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); 1197 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); 1198 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_UVD_CNTL, tmp); 1199 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_UVD_CNTL, tmp); 1200 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); 1201 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); 1202 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 1203 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 1204 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 1205 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 1206 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 1207 1.1 riastrad WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 1208 1.1 riastrad (u32)(rdev->dummy_page.addr >> 12)); 1209 1.1 riastrad for (i = 1; i < 7; i++) 1210 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 1211 1.1 riastrad 1212 1.1 riastrad r600_pcie_gart_tlb_flush(rdev); 1213 1.1 riastrad DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1214 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20), 1215 1.1 riastrad (unsigned long long)rdev->gart.table_addr); 1216 1.1 riastrad rdev->gart.ready = true; 1217 1.1 riastrad return 0; 1218 1.1 riastrad } 1219 1.1 riastrad 1220 1.1 riastrad static void r600_pcie_gart_disable(struct radeon_device *rdev) 1221 1.1 riastrad { 1222 1.1 riastrad u32 tmp; 1223 1.1 riastrad int i; 1224 1.1 riastrad 1225 1.1 riastrad /* Disable all tables */ 1226 1.1 riastrad for (i = 0; i < 7; i++) 1227 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 1228 1.1 riastrad 1229 1.1 riastrad /* Disable L2 cache */ 1230 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING | 1231 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 1232 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); 1233 1.1 riastrad /* Setup L1 TLB control */ 1234 1.1 riastrad tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | 1235 1.1 riastrad ENABLE_WAIT_L2_QUERY; 1236 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); 1237 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); 1238 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); 1239 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); 1240 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); 1241 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); 1242 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); 1243 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); 1244 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp); 1245 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp); 1246 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); 1247 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); 1248 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp); 1249 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); 1250 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_UVD_CNTL, tmp); 1251 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_UVD_CNTL, tmp); 1252 1.1 riastrad radeon_gart_table_vram_unpin(rdev); 1253 1.1 riastrad } 1254 1.1 riastrad 1255 1.1 riastrad static void r600_pcie_gart_fini(struct radeon_device *rdev) 1256 1.1 riastrad { 1257 1.1 riastrad radeon_gart_fini(rdev); 1258 1.1 riastrad r600_pcie_gart_disable(rdev); 1259 1.1 riastrad radeon_gart_table_vram_free(rdev); 1260 1.1 riastrad } 1261 1.1 riastrad 1262 1.1 riastrad static void r600_agp_enable(struct radeon_device *rdev) 1263 1.1 riastrad { 1264 1.1 riastrad u32 tmp; 1265 1.1 riastrad int i; 1266 1.1 riastrad 1267 1.1 riastrad /* Setup L2 cache */ 1268 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 1269 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1270 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 1271 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 1272 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); 1273 1.1 riastrad /* Setup TLB control */ 1274 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 1275 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1276 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | 1277 1.1 riastrad ENABLE_WAIT_L2_QUERY; 1278 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); 1279 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); 1280 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING); 1281 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); 1282 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); 1283 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); 1284 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); 1285 1.1 riastrad WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); 1286 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); 1287 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); 1288 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); 1289 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); 1290 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); 1291 1.1 riastrad WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); 1292 1.1 riastrad for (i = 0; i < 7; i++) 1293 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 1294 1.1 riastrad } 1295 1.1 riastrad 1296 1.1 riastrad int r600_mc_wait_for_idle(struct radeon_device *rdev) 1297 1.1 riastrad { 1298 1.1 riastrad unsigned i; 1299 1.1 riastrad u32 tmp; 1300 1.1 riastrad 1301 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 1302 1.1 riastrad /* read MC_STATUS */ 1303 1.1 riastrad tmp = RREG32(R_000E50_SRBM_STATUS) & 0x3F00; 1304 1.1 riastrad if (!tmp) 1305 1.1 riastrad return 0; 1306 1.1 riastrad udelay(1); 1307 1.1 riastrad } 1308 1.1 riastrad return -1; 1309 1.1 riastrad } 1310 1.1 riastrad 1311 1.1 riastrad uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) 1312 1.1 riastrad { 1313 1.1 riastrad unsigned long flags; 1314 1.1 riastrad uint32_t r; 1315 1.1 riastrad 1316 1.1 riastrad spin_lock_irqsave(&rdev->mc_idx_lock, flags); 1317 1.1 riastrad WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); 1318 1.1 riastrad r = RREG32(R_0028FC_MC_DATA); 1319 1.1 riastrad WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); 1320 1.1 riastrad spin_unlock_irqrestore(&rdev->mc_idx_lock, flags); 1321 1.1 riastrad return r; 1322 1.1 riastrad } 1323 1.1 riastrad 1324 1.1 riastrad void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 1325 1.1 riastrad { 1326 1.1 riastrad unsigned long flags; 1327 1.1 riastrad 1328 1.1 riastrad spin_lock_irqsave(&rdev->mc_idx_lock, flags); 1329 1.1 riastrad WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | 1330 1.1 riastrad S_0028F8_MC_IND_WR_EN(1)); 1331 1.1 riastrad WREG32(R_0028FC_MC_DATA, v); 1332 1.1 riastrad WREG32(R_0028F8_MC_INDEX, 0x7F); 1333 1.1 riastrad spin_unlock_irqrestore(&rdev->mc_idx_lock, flags); 1334 1.1 riastrad } 1335 1.1 riastrad 1336 1.1 riastrad static void r600_mc_program(struct radeon_device *rdev) 1337 1.1 riastrad { 1338 1.1 riastrad struct rv515_mc_save save; 1339 1.1 riastrad u32 tmp; 1340 1.1 riastrad int i, j; 1341 1.1 riastrad 1342 1.1 riastrad /* Initialize HDP */ 1343 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 1344 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 1345 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 1346 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 1347 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 1348 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 1349 1.1 riastrad } 1350 1.1 riastrad WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); 1351 1.1 riastrad 1352 1.1 riastrad rv515_mc_stop(rdev, &save); 1353 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1354 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1355 1.1 riastrad } 1356 1.1 riastrad /* Lockout access through VGA aperture (doesn't exist before R600) */ 1357 1.1 riastrad WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); 1358 1.1 riastrad /* Update configuration */ 1359 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1360 1.1 riastrad if (rdev->mc.vram_start < rdev->mc.gtt_start) { 1361 1.1 riastrad /* VRAM before AGP */ 1362 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 1363 1.1 riastrad rdev->mc.vram_start >> 12); 1364 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 1365 1.1 riastrad rdev->mc.gtt_end >> 12); 1366 1.1 riastrad } else { 1367 1.1 riastrad /* VRAM after AGP */ 1368 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 1369 1.1 riastrad rdev->mc.gtt_start >> 12); 1370 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 1371 1.1 riastrad rdev->mc.vram_end >> 12); 1372 1.1 riastrad } 1373 1.1 riastrad } else { 1374 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); 1375 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12); 1376 1.1 riastrad } 1377 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); 1378 1.1 riastrad tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; 1379 1.1 riastrad tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 1380 1.1 riastrad WREG32(MC_VM_FB_LOCATION, tmp); 1381 1.1 riastrad WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 1382 1.1 riastrad WREG32(HDP_NONSURFACE_INFO, (2 << 7)); 1383 1.1 riastrad WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 1384 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1385 1.1 riastrad WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); 1386 1.1 riastrad WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); 1387 1.1 riastrad WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); 1388 1.1 riastrad } else { 1389 1.1 riastrad WREG32(MC_VM_AGP_BASE, 0); 1390 1.1 riastrad WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); 1391 1.1 riastrad WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); 1392 1.1 riastrad } 1393 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1394 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1395 1.1 riastrad } 1396 1.1 riastrad rv515_mc_resume(rdev, &save); 1397 1.1 riastrad /* we need to own VRAM, so turn off the VGA renderer here 1398 1.1 riastrad * to stop it overwriting our objects */ 1399 1.1 riastrad rv515_vga_render_disable(rdev); 1400 1.1 riastrad } 1401 1.1 riastrad 1402 1.1 riastrad /** 1403 1.1 riastrad * r600_vram_gtt_location - try to find VRAM & GTT location 1404 1.1 riastrad * @rdev: radeon device structure holding all necessary informations 1405 1.1 riastrad * @mc: memory controller structure holding memory informations 1406 1.1 riastrad * 1407 1.1 riastrad * Function will place try to place VRAM at same place as in CPU (PCI) 1408 1.1 riastrad * address space as some GPU seems to have issue when we reprogram at 1409 1.1 riastrad * different address space. 1410 1.1 riastrad * 1411 1.1 riastrad * If there is not enough space to fit the unvisible VRAM after the 1412 1.1 riastrad * aperture then we limit the VRAM size to the aperture. 1413 1.1 riastrad * 1414 1.1 riastrad * If we are using AGP then place VRAM adjacent to AGP aperture are we need 1415 1.1 riastrad * them to be in one from GPU point of view so that we can program GPU to 1416 1.1 riastrad * catch access outside them (weird GPU policy see ??). 1417 1.1 riastrad * 1418 1.1 riastrad * This function will never fails, worst case are limiting VRAM or GTT. 1419 1.1 riastrad * 1420 1.1 riastrad * Note: GTT start, end, size should be initialized before calling this 1421 1.1 riastrad * function on AGP platform. 1422 1.1 riastrad */ 1423 1.1 riastrad static void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) 1424 1.1 riastrad { 1425 1.1 riastrad u64 size_bf, size_af; 1426 1.1 riastrad 1427 1.1 riastrad if (mc->mc_vram_size > 0xE0000000) { 1428 1.1 riastrad /* leave room for at least 512M GTT */ 1429 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1430 1.1 riastrad mc->real_vram_size = 0xE0000000; 1431 1.1 riastrad mc->mc_vram_size = 0xE0000000; 1432 1.1 riastrad } 1433 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1434 1.1 riastrad size_bf = mc->gtt_start; 1435 1.1 riastrad size_af = mc->mc_mask - mc->gtt_end; 1436 1.1 riastrad if (size_bf > size_af) { 1437 1.1 riastrad if (mc->mc_vram_size > size_bf) { 1438 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1439 1.1 riastrad mc->real_vram_size = size_bf; 1440 1.1 riastrad mc->mc_vram_size = size_bf; 1441 1.1 riastrad } 1442 1.1 riastrad mc->vram_start = mc->gtt_start - mc->mc_vram_size; 1443 1.1 riastrad } else { 1444 1.1 riastrad if (mc->mc_vram_size > size_af) { 1445 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1446 1.1 riastrad mc->real_vram_size = size_af; 1447 1.1 riastrad mc->mc_vram_size = size_af; 1448 1.1 riastrad } 1449 1.1 riastrad mc->vram_start = mc->gtt_end + 1; 1450 1.1 riastrad } 1451 1.1 riastrad mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; 1452 1.1 riastrad dev_info(rdev->dev, "VRAM: %"PRIu64"M 0x%08"PRIX64" - 0x%08"PRIX64" (%"PRIu64"M used)\n", 1453 1.1 riastrad mc->mc_vram_size >> 20, mc->vram_start, 1454 1.1 riastrad mc->vram_end, mc->real_vram_size >> 20); 1455 1.1 riastrad } else { 1456 1.1 riastrad u64 base = 0; 1457 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 1458 1.1 riastrad base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF; 1459 1.1 riastrad base <<= 24; 1460 1.1 riastrad } 1461 1.1 riastrad radeon_vram_location(rdev, &rdev->mc, base); 1462 1.1 riastrad rdev->mc.gtt_base_align = 0; 1463 1.1 riastrad radeon_gtt_location(rdev, mc); 1464 1.1 riastrad } 1465 1.1 riastrad } 1466 1.1 riastrad 1467 1.1 riastrad static int r600_mc_init(struct radeon_device *rdev) 1468 1.1 riastrad { 1469 1.1 riastrad u32 tmp; 1470 1.1 riastrad int chansize, numchan; 1471 1.1 riastrad uint32_t h_addr, l_addr; 1472 1.1 riastrad unsigned long long k8_addr; 1473 1.1 riastrad 1474 1.1 riastrad /* Get VRAM informations */ 1475 1.1 riastrad rdev->mc.vram_is_ddr = true; 1476 1.1 riastrad tmp = RREG32(RAMCFG); 1477 1.1 riastrad if (tmp & CHANSIZE_OVERRIDE) { 1478 1.1 riastrad chansize = 16; 1479 1.1 riastrad } else if (tmp & CHANSIZE_MASK) { 1480 1.1 riastrad chansize = 64; 1481 1.1 riastrad } else { 1482 1.1 riastrad chansize = 32; 1483 1.1 riastrad } 1484 1.1 riastrad tmp = RREG32(CHMAP); 1485 1.1 riastrad switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { 1486 1.1 riastrad case 0: 1487 1.1 riastrad default: 1488 1.1 riastrad numchan = 1; 1489 1.1 riastrad break; 1490 1.1 riastrad case 1: 1491 1.1 riastrad numchan = 2; 1492 1.1 riastrad break; 1493 1.1 riastrad case 2: 1494 1.1 riastrad numchan = 4; 1495 1.1 riastrad break; 1496 1.1 riastrad case 3: 1497 1.1 riastrad numchan = 8; 1498 1.1 riastrad break; 1499 1.1 riastrad } 1500 1.1 riastrad rdev->mc.vram_width = numchan * chansize; 1501 1.1 riastrad /* Could aper size report 0 ? */ 1502 1.1 riastrad rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 1503 1.1 riastrad rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 1504 1.1 riastrad /* Setup GPU memory space */ 1505 1.1 riastrad rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1506 1.1 riastrad rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1507 1.1 riastrad rdev->mc.visible_vram_size = rdev->mc.aper_size; 1508 1.1 riastrad r600_vram_gtt_location(rdev, &rdev->mc); 1509 1.1 riastrad 1510 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) { 1511 1.1 riastrad rs690_pm_info(rdev); 1512 1.1 riastrad rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 1513 1.1 riastrad 1514 1.1 riastrad if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { 1515 1.1 riastrad /* Use K8 direct mapping for fast fb access. */ 1516 1.1 riastrad rdev->fastfb_working = false; 1517 1.1 riastrad h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); 1518 1.1 riastrad l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); 1519 1.1 riastrad k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; 1520 1.1 riastrad #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) 1521 1.1 riastrad if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) 1522 1.1 riastrad #endif 1523 1.1 riastrad { 1524 1.1 riastrad /* FastFB shall be used with UMA memory. Here it is simply disabled when sideport 1525 1.1 riastrad * memory is present. 1526 1.1 riastrad */ 1527 1.1 riastrad if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { 1528 1.1 riastrad DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", 1529 1.1 riastrad (unsigned long long)rdev->mc.aper_base, k8_addr); 1530 1.1 riastrad rdev->mc.aper_base = (resource_size_t)k8_addr; 1531 1.1 riastrad rdev->fastfb_working = true; 1532 1.1 riastrad } 1533 1.1 riastrad } 1534 1.6 riastrad } 1535 1.1 riastrad } 1536 1.1 riastrad 1537 1.1 riastrad radeon_update_bandwidth_info(rdev); 1538 1.1 riastrad return 0; 1539 1.1 riastrad } 1540 1.1 riastrad 1541 1.1 riastrad int r600_vram_scratch_init(struct radeon_device *rdev) 1542 1.1 riastrad { 1543 1.1 riastrad int r; 1544 1.1 riastrad 1545 1.1 riastrad if (rdev->vram_scratch.robj == NULL) { 1546 1.1 riastrad r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, 1547 1.1 riastrad PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 1548 1.1 riastrad 0, NULL, NULL, &rdev->vram_scratch.robj); 1549 1.1 riastrad if (r) { 1550 1.1 riastrad return r; 1551 1.1 riastrad } 1552 1.1 riastrad } 1553 1.1 riastrad 1554 1.1 riastrad r = radeon_bo_reserve(rdev->vram_scratch.robj, false); 1555 1.1 riastrad if (unlikely(r != 0)) 1556 1.1 riastrad return r; 1557 1.1 riastrad r = radeon_bo_pin(rdev->vram_scratch.robj, 1558 1.1 riastrad RADEON_GEM_DOMAIN_VRAM, &rdev->vram_scratch.gpu_addr); 1559 1.1 riastrad if (r) { 1560 1.1 riastrad radeon_bo_unreserve(rdev->vram_scratch.robj); 1561 1.1 riastrad return r; 1562 1.1 riastrad } 1563 1.1 riastrad r = radeon_bo_kmap(rdev->vram_scratch.robj, 1564 1.1 riastrad (void **)__UNVOLATILE(&rdev->vram_scratch.ptr)); 1565 1.1 riastrad if (r) 1566 1.1 riastrad radeon_bo_unpin(rdev->vram_scratch.robj); 1567 1.1 riastrad radeon_bo_unreserve(rdev->vram_scratch.robj); 1568 1.1 riastrad 1569 1.1 riastrad return r; 1570 1.1 riastrad } 1571 1.1 riastrad 1572 1.1 riastrad void r600_vram_scratch_fini(struct radeon_device *rdev) 1573 1.1 riastrad { 1574 1.1 riastrad int r; 1575 1.1 riastrad 1576 1.1 riastrad if (rdev->vram_scratch.robj == NULL) { 1577 1.1 riastrad return; 1578 1.1 riastrad } 1579 1.1 riastrad r = radeon_bo_reserve(rdev->vram_scratch.robj, false); 1580 1.1 riastrad if (likely(r == 0)) { 1581 1.1 riastrad radeon_bo_kunmap(rdev->vram_scratch.robj); 1582 1.1 riastrad radeon_bo_unpin(rdev->vram_scratch.robj); 1583 1.1 riastrad radeon_bo_unreserve(rdev->vram_scratch.robj); 1584 1.1 riastrad } 1585 1.1 riastrad radeon_bo_unref(&rdev->vram_scratch.robj); 1586 1.1 riastrad } 1587 1.1 riastrad 1588 1.1 riastrad void r600_set_bios_scratch_engine_hung(struct radeon_device *rdev, bool hung) 1589 1.1 riastrad { 1590 1.1 riastrad u32 tmp = RREG32(R600_BIOS_3_SCRATCH); 1591 1.1 riastrad 1592 1.1 riastrad if (hung) 1593 1.1 riastrad tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1594 1.1 riastrad else 1595 1.1 riastrad tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1596 1.1 riastrad 1597 1.1 riastrad WREG32(R600_BIOS_3_SCRATCH, tmp); 1598 1.1 riastrad } 1599 1.1 riastrad 1600 1.1 riastrad static void r600_print_gpu_status_regs(struct radeon_device *rdev) 1601 1.1 riastrad { 1602 1.1 riastrad dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", 1603 1.1 riastrad RREG32(R_008010_GRBM_STATUS)); 1604 1.1 riastrad dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", 1605 1.1 riastrad RREG32(R_008014_GRBM_STATUS2)); 1606 1.1 riastrad dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", 1607 1.1 riastrad RREG32(R_000E50_SRBM_STATUS)); 1608 1.1 riastrad dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1609 1.1 riastrad RREG32(CP_STALLED_STAT1)); 1610 1.1 riastrad dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1611 1.1 riastrad RREG32(CP_STALLED_STAT2)); 1612 1.1 riastrad dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1613 1.1 riastrad RREG32(CP_BUSY_STAT)); 1614 1.1 riastrad dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1615 1.1 riastrad RREG32(CP_STAT)); 1616 1.1 riastrad dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 1617 1.1 riastrad RREG32(DMA_STATUS_REG)); 1618 1.1 riastrad } 1619 1.1 riastrad 1620 1.1 riastrad static bool r600_is_display_hung(struct radeon_device *rdev) 1621 1.1 riastrad { 1622 1.1 riastrad u32 crtc_hung = 0; 1623 1.1 riastrad u32 crtc_status[2]; 1624 1.1 riastrad u32 i, j, tmp; 1625 1.1 riastrad 1626 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 1627 1.1 riastrad if (RREG32(AVIVO_D1CRTC_CONTROL + crtc_offsets[i]) & AVIVO_CRTC_EN) { 1628 1.1 riastrad crtc_status[i] = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 1629 1.1 riastrad crtc_hung |= (1 << i); 1630 1.1 riastrad } 1631 1.1 riastrad } 1632 1.1 riastrad 1633 1.1 riastrad for (j = 0; j < 10; j++) { 1634 1.1 riastrad for (i = 0; i < rdev->num_crtc; i++) { 1635 1.1 riastrad if (crtc_hung & (1 << i)) { 1636 1.1 riastrad tmp = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 1637 1.1 riastrad if (tmp != crtc_status[i]) 1638 1.1 riastrad crtc_hung &= ~(1 << i); 1639 1.1 riastrad } 1640 1.1 riastrad } 1641 1.1 riastrad if (crtc_hung == 0) 1642 1.1 riastrad return false; 1643 1.1 riastrad udelay(100); 1644 1.1 riastrad } 1645 1.1 riastrad 1646 1.1 riastrad return true; 1647 1.1 riastrad } 1648 1.1 riastrad 1649 1.1 riastrad u32 r600_gpu_check_soft_reset(struct radeon_device *rdev) 1650 1.1 riastrad { 1651 1.1 riastrad u32 reset_mask = 0; 1652 1.1 riastrad u32 tmp; 1653 1.1 riastrad 1654 1.1 riastrad /* GRBM_STATUS */ 1655 1.1 riastrad tmp = RREG32(R_008010_GRBM_STATUS); 1656 1.1 riastrad if (rdev->family >= CHIP_RV770) { 1657 1.1 riastrad if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) | 1658 1.1 riastrad G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) | 1659 1.1 riastrad G_008010_TA_BUSY(tmp) | G_008010_VGT_BUSY(tmp) | 1660 1.1 riastrad G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) | 1661 1.1 riastrad G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp)) 1662 1.1 riastrad reset_mask |= RADEON_RESET_GFX; 1663 1.1 riastrad } else { 1664 1.1 riastrad if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) | 1665 1.1 riastrad G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) | 1666 1.1 riastrad G_008010_TA03_BUSY(tmp) | G_008010_VGT_BUSY(tmp) | 1667 1.1 riastrad G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) | 1668 1.1 riastrad G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp)) 1669 1.1 riastrad reset_mask |= RADEON_RESET_GFX; 1670 1.1 riastrad } 1671 1.1 riastrad 1672 1.1 riastrad if (G_008010_CF_RQ_PENDING(tmp) | G_008010_PF_RQ_PENDING(tmp) | 1673 1.1 riastrad G_008010_CP_BUSY(tmp) | G_008010_CP_COHERENCY_BUSY(tmp)) 1674 1.1 riastrad reset_mask |= RADEON_RESET_CP; 1675 1.1 riastrad 1676 1.1 riastrad if (G_008010_GRBM_EE_BUSY(tmp)) 1677 1.1 riastrad reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 1678 1.1 riastrad 1679 1.1 riastrad /* DMA_STATUS_REG */ 1680 1.1 riastrad tmp = RREG32(DMA_STATUS_REG); 1681 1.1 riastrad if (!(tmp & DMA_IDLE)) 1682 1.1 riastrad reset_mask |= RADEON_RESET_DMA; 1683 1.1 riastrad 1684 1.1 riastrad /* SRBM_STATUS */ 1685 1.1 riastrad tmp = RREG32(R_000E50_SRBM_STATUS); 1686 1.1 riastrad if (G_000E50_RLC_RQ_PENDING(tmp) | G_000E50_RLC_BUSY(tmp)) 1687 1.1 riastrad reset_mask |= RADEON_RESET_RLC; 1688 1.1 riastrad 1689 1.1 riastrad if (G_000E50_IH_BUSY(tmp)) 1690 1.1 riastrad reset_mask |= RADEON_RESET_IH; 1691 1.1 riastrad 1692 1.1 riastrad if (G_000E50_SEM_BUSY(tmp)) 1693 1.1 riastrad reset_mask |= RADEON_RESET_SEM; 1694 1.1 riastrad 1695 1.1 riastrad if (G_000E50_GRBM_RQ_PENDING(tmp)) 1696 1.1 riastrad reset_mask |= RADEON_RESET_GRBM; 1697 1.1 riastrad 1698 1.1 riastrad if (G_000E50_VMC_BUSY(tmp)) 1699 1.1 riastrad reset_mask |= RADEON_RESET_VMC; 1700 1.1 riastrad 1701 1.1 riastrad if (G_000E50_MCB_BUSY(tmp) | G_000E50_MCDZ_BUSY(tmp) | 1702 1.1 riastrad G_000E50_MCDY_BUSY(tmp) | G_000E50_MCDX_BUSY(tmp) | 1703 1.1 riastrad G_000E50_MCDW_BUSY(tmp)) 1704 1.1 riastrad reset_mask |= RADEON_RESET_MC; 1705 1.1 riastrad 1706 1.1 riastrad if (r600_is_display_hung(rdev)) 1707 1.1 riastrad reset_mask |= RADEON_RESET_DISPLAY; 1708 1.1 riastrad 1709 1.1 riastrad /* Skip MC reset as it's mostly likely not hung, just busy */ 1710 1.1 riastrad if (reset_mask & RADEON_RESET_MC) { 1711 1.1 riastrad DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask); 1712 1.1 riastrad reset_mask &= ~RADEON_RESET_MC; 1713 1.1 riastrad } 1714 1.1 riastrad 1715 1.1 riastrad return reset_mask; 1716 1.1 riastrad } 1717 1.1 riastrad 1718 1.1 riastrad static void r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1719 1.1 riastrad { 1720 1.1 riastrad struct rv515_mc_save save; 1721 1.1 riastrad u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 1722 1.1 riastrad u32 tmp; 1723 1.1 riastrad 1724 1.1 riastrad if (reset_mask == 0) 1725 1.1 riastrad return; 1726 1.1 riastrad 1727 1.1 riastrad dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 1728 1.1 riastrad 1729 1.1 riastrad r600_print_gpu_status_regs(rdev); 1730 1.1 riastrad 1731 1.1 riastrad /* Disable CP parsing/prefetching */ 1732 1.1 riastrad if (rdev->family >= CHIP_RV770) 1733 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1) | S_0086D8_CP_PFP_HALT(1)); 1734 1.1 riastrad else 1735 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1736 1.1 riastrad 1737 1.1 riastrad /* disable the RLC */ 1738 1.1 riastrad WREG32(RLC_CNTL, 0); 1739 1.1 riastrad 1740 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) { 1741 1.1 riastrad /* Disable DMA */ 1742 1.1 riastrad tmp = RREG32(DMA_RB_CNTL); 1743 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 1744 1.1 riastrad WREG32(DMA_RB_CNTL, tmp); 1745 1.1 riastrad } 1746 1.1 riastrad 1747 1.1 riastrad mdelay(50); 1748 1.1 riastrad 1749 1.1 riastrad rv515_mc_stop(rdev, &save); 1750 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1751 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1752 1.1 riastrad } 1753 1.1 riastrad 1754 1.1 riastrad if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 1755 1.1 riastrad if (rdev->family >= CHIP_RV770) 1756 1.1 riastrad grbm_soft_reset |= S_008020_SOFT_RESET_DB(1) | 1757 1.1 riastrad S_008020_SOFT_RESET_CB(1) | 1758 1.1 riastrad S_008020_SOFT_RESET_PA(1) | 1759 1.1 riastrad S_008020_SOFT_RESET_SC(1) | 1760 1.1 riastrad S_008020_SOFT_RESET_SPI(1) | 1761 1.1 riastrad S_008020_SOFT_RESET_SX(1) | 1762 1.1 riastrad S_008020_SOFT_RESET_SH(1) | 1763 1.1 riastrad S_008020_SOFT_RESET_TC(1) | 1764 1.1 riastrad S_008020_SOFT_RESET_TA(1) | 1765 1.1 riastrad S_008020_SOFT_RESET_VC(1) | 1766 1.1 riastrad S_008020_SOFT_RESET_VGT(1); 1767 1.1 riastrad else 1768 1.1 riastrad grbm_soft_reset |= S_008020_SOFT_RESET_CR(1) | 1769 1.1 riastrad S_008020_SOFT_RESET_DB(1) | 1770 1.1 riastrad S_008020_SOFT_RESET_CB(1) | 1771 1.1 riastrad S_008020_SOFT_RESET_PA(1) | 1772 1.1 riastrad S_008020_SOFT_RESET_SC(1) | 1773 1.1 riastrad S_008020_SOFT_RESET_SMX(1) | 1774 1.1 riastrad S_008020_SOFT_RESET_SPI(1) | 1775 1.1 riastrad S_008020_SOFT_RESET_SX(1) | 1776 1.1 riastrad S_008020_SOFT_RESET_SH(1) | 1777 1.1 riastrad S_008020_SOFT_RESET_TC(1) | 1778 1.1 riastrad S_008020_SOFT_RESET_TA(1) | 1779 1.1 riastrad S_008020_SOFT_RESET_VC(1) | 1780 1.1 riastrad S_008020_SOFT_RESET_VGT(1); 1781 1.1 riastrad } 1782 1.1 riastrad 1783 1.1 riastrad if (reset_mask & RADEON_RESET_CP) { 1784 1.1 riastrad grbm_soft_reset |= S_008020_SOFT_RESET_CP(1) | 1785 1.1 riastrad S_008020_SOFT_RESET_VGT(1); 1786 1.1 riastrad 1787 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1); 1788 1.1 riastrad } 1789 1.1 riastrad 1790 1.1 riastrad if (reset_mask & RADEON_RESET_DMA) { 1791 1.1 riastrad if (rdev->family >= CHIP_RV770) 1792 1.1 riastrad srbm_soft_reset |= RV770_SOFT_RESET_DMA; 1793 1.1 riastrad else 1794 1.1 riastrad srbm_soft_reset |= SOFT_RESET_DMA; 1795 1.1 riastrad } 1796 1.1 riastrad 1797 1.1 riastrad if (reset_mask & RADEON_RESET_RLC) 1798 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_RLC(1); 1799 1.1 riastrad 1800 1.1 riastrad if (reset_mask & RADEON_RESET_SEM) 1801 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_SEM(1); 1802 1.1 riastrad 1803 1.1 riastrad if (reset_mask & RADEON_RESET_IH) 1804 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_IH(1); 1805 1.1 riastrad 1806 1.1 riastrad if (reset_mask & RADEON_RESET_GRBM) 1807 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1); 1808 1.1 riastrad 1809 1.1 riastrad if (!(rdev->flags & RADEON_IS_IGP)) { 1810 1.1 riastrad if (reset_mask & RADEON_RESET_MC) 1811 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_MC(1); 1812 1.1 riastrad } 1813 1.1 riastrad 1814 1.1 riastrad if (reset_mask & RADEON_RESET_VMC) 1815 1.1 riastrad srbm_soft_reset |= S_000E60_SOFT_RESET_VMC(1); 1816 1.1 riastrad 1817 1.1 riastrad if (grbm_soft_reset) { 1818 1.1 riastrad tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1819 1.1 riastrad tmp |= grbm_soft_reset; 1820 1.1 riastrad dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); 1821 1.1 riastrad WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1822 1.1 riastrad tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1823 1.1 riastrad 1824 1.1 riastrad udelay(50); 1825 1.1 riastrad 1826 1.1 riastrad tmp &= ~grbm_soft_reset; 1827 1.1 riastrad WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1828 1.1 riastrad tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1829 1.1 riastrad } 1830 1.1 riastrad 1831 1.1 riastrad if (srbm_soft_reset) { 1832 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1833 1.1 riastrad tmp |= srbm_soft_reset; 1834 1.1 riastrad dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1835 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 1836 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1837 1.1 riastrad 1838 1.1 riastrad udelay(50); 1839 1.1 riastrad 1840 1.1 riastrad tmp &= ~srbm_soft_reset; 1841 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 1842 1.1 riastrad tmp = RREG32(SRBM_SOFT_RESET); 1843 1.1 riastrad } 1844 1.1 riastrad 1845 1.1 riastrad /* Wait a little for things to settle down */ 1846 1.1 riastrad mdelay(1); 1847 1.1 riastrad 1848 1.1 riastrad rv515_mc_resume(rdev, &save); 1849 1.1 riastrad udelay(50); 1850 1.1 riastrad 1851 1.1 riastrad r600_print_gpu_status_regs(rdev); 1852 1.1 riastrad } 1853 1.1 riastrad 1854 1.1 riastrad static void r600_gpu_pci_config_reset(struct radeon_device *rdev) 1855 1.1 riastrad { 1856 1.1 riastrad struct rv515_mc_save save; 1857 1.1 riastrad u32 tmp, i; 1858 1.1 riastrad 1859 1.1 riastrad dev_info(rdev->dev, "GPU pci config reset\n"); 1860 1.1 riastrad 1861 1.1 riastrad /* disable dpm? */ 1862 1.1 riastrad 1863 1.1 riastrad /* Disable CP parsing/prefetching */ 1864 1.1 riastrad if (rdev->family >= CHIP_RV770) 1865 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1) | S_0086D8_CP_PFP_HALT(1)); 1866 1.1 riastrad else 1867 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1868 1.1 riastrad 1869 1.1 riastrad /* disable the RLC */ 1870 1.1 riastrad WREG32(RLC_CNTL, 0); 1871 1.1 riastrad 1872 1.1 riastrad /* Disable DMA */ 1873 1.1 riastrad tmp = RREG32(DMA_RB_CNTL); 1874 1.1 riastrad tmp &= ~DMA_RB_ENABLE; 1875 1.1 riastrad WREG32(DMA_RB_CNTL, tmp); 1876 1.1 riastrad 1877 1.1 riastrad mdelay(50); 1878 1.1 riastrad 1879 1.1 riastrad /* set mclk/sclk to bypass */ 1880 1.1 riastrad if (rdev->family >= CHIP_RV770) 1881 1.1 riastrad rv770_set_clk_bypass_mode(rdev); 1882 1.1 riastrad /* disable BM */ 1883 1.1 riastrad pci_clear_master(rdev->pdev); 1884 1.1 riastrad /* disable mem access */ 1885 1.1 riastrad rv515_mc_stop(rdev, &save); 1886 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1887 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1888 1.1 riastrad } 1889 1.1 riastrad 1890 1.1 riastrad /* BIF reset workaround. Not sure if this is needed on 6xx */ 1891 1.1 riastrad tmp = RREG32(BUS_CNTL); 1892 1.1 riastrad tmp |= VGA_COHE_SPEC_TIMER_DIS; 1893 1.1 riastrad WREG32(BUS_CNTL, tmp); 1894 1.1 riastrad 1895 1.1 riastrad tmp = RREG32(BIF_SCRATCH0); 1896 1.1 riastrad 1897 1.1 riastrad /* reset */ 1898 1.1 riastrad radeon_pci_config_reset(rdev); 1899 1.1 riastrad mdelay(1); 1900 1.1 riastrad 1901 1.1 riastrad /* BIF reset workaround. Not sure if this is needed on 6xx */ 1902 1.1 riastrad tmp = SOFT_RESET_BIF; 1903 1.1 riastrad WREG32(SRBM_SOFT_RESET, tmp); 1904 1.1 riastrad mdelay(1); 1905 1.1 riastrad WREG32(SRBM_SOFT_RESET, 0); 1906 1.1 riastrad 1907 1.1 riastrad /* wait for asic to come out of reset */ 1908 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 1909 1.1 riastrad if (RREG32(CONFIG_MEMSIZE) != 0xffffffff) 1910 1.1 riastrad break; 1911 1.1 riastrad udelay(1); 1912 1.1 riastrad } 1913 1.1 riastrad } 1914 1.1 riastrad 1915 1.6 riastrad int r600_asic_reset(struct radeon_device *rdev, bool hard) 1916 1.1 riastrad { 1917 1.1 riastrad u32 reset_mask; 1918 1.1 riastrad 1919 1.6 riastrad if (hard) { 1920 1.6 riastrad r600_gpu_pci_config_reset(rdev); 1921 1.6 riastrad return 0; 1922 1.6 riastrad } 1923 1.6 riastrad 1924 1.1 riastrad reset_mask = r600_gpu_check_soft_reset(rdev); 1925 1.1 riastrad 1926 1.1 riastrad if (reset_mask) 1927 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, true); 1928 1.1 riastrad 1929 1.1 riastrad /* try soft reset */ 1930 1.1 riastrad r600_gpu_soft_reset(rdev, reset_mask); 1931 1.1 riastrad 1932 1.1 riastrad reset_mask = r600_gpu_check_soft_reset(rdev); 1933 1.1 riastrad 1934 1.1 riastrad /* try pci config reset */ 1935 1.1 riastrad if (reset_mask && radeon_hard_reset) 1936 1.1 riastrad r600_gpu_pci_config_reset(rdev); 1937 1.1 riastrad 1938 1.1 riastrad reset_mask = r600_gpu_check_soft_reset(rdev); 1939 1.1 riastrad 1940 1.1 riastrad if (!reset_mask) 1941 1.1 riastrad r600_set_bios_scratch_engine_hung(rdev, false); 1942 1.1 riastrad 1943 1.1 riastrad return 0; 1944 1.1 riastrad } 1945 1.1 riastrad 1946 1.1 riastrad /** 1947 1.1 riastrad * r600_gfx_is_lockup - Check if the GFX engine is locked up 1948 1.1 riastrad * 1949 1.1 riastrad * @rdev: radeon_device pointer 1950 1.1 riastrad * @ring: radeon_ring structure holding ring information 1951 1.1 riastrad * 1952 1.1 riastrad * Check if the GFX engine is locked up. 1953 1.1 riastrad * Returns true if the engine appears to be locked up, false if not. 1954 1.1 riastrad */ 1955 1.1 riastrad bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1956 1.1 riastrad { 1957 1.1 riastrad u32 reset_mask = r600_gpu_check_soft_reset(rdev); 1958 1.1 riastrad 1959 1.1 riastrad if (!(reset_mask & (RADEON_RESET_GFX | 1960 1.1 riastrad RADEON_RESET_COMPUTE | 1961 1.1 riastrad RADEON_RESET_CP))) { 1962 1.1 riastrad radeon_ring_lockup_update(rdev, ring); 1963 1.1 riastrad return false; 1964 1.1 riastrad } 1965 1.1 riastrad return radeon_ring_test_lockup(rdev, ring); 1966 1.1 riastrad } 1967 1.1 riastrad 1968 1.1 riastrad u32 r6xx_remap_render_backend(struct radeon_device *rdev, 1969 1.1 riastrad u32 tiling_pipe_num, 1970 1.1 riastrad u32 max_rb_num, 1971 1.1 riastrad u32 total_max_rb_num, 1972 1.1 riastrad u32 disabled_rb_mask) 1973 1.1 riastrad { 1974 1.1 riastrad u32 rendering_pipe_num, rb_num_width, req_rb_num; 1975 1.1 riastrad u32 pipe_rb_ratio, pipe_rb_remain, tmp; 1976 1.1 riastrad u32 data = 0, mask = 1 << (max_rb_num - 1); 1977 1.1 riastrad unsigned i, j; 1978 1.1 riastrad 1979 1.1 riastrad /* mask out the RBs that don't exist on that asic */ 1980 1.1 riastrad tmp = disabled_rb_mask | ((0xff << max_rb_num) & 0xff); 1981 1.1 riastrad /* make sure at least one RB is available */ 1982 1.1 riastrad if ((tmp & 0xff) != 0xff) 1983 1.1 riastrad disabled_rb_mask = tmp; 1984 1.1 riastrad 1985 1.1 riastrad rendering_pipe_num = 1 << tiling_pipe_num; 1986 1.1 riastrad req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask); 1987 1.1 riastrad BUG_ON(rendering_pipe_num < req_rb_num); 1988 1.1 riastrad 1989 1.1 riastrad pipe_rb_ratio = rendering_pipe_num / req_rb_num; 1990 1.1 riastrad pipe_rb_remain = rendering_pipe_num - pipe_rb_ratio * req_rb_num; 1991 1.1 riastrad 1992 1.1 riastrad if (rdev->family <= CHIP_RV740) { 1993 1.1 riastrad /* r6xx/r7xx */ 1994 1.1 riastrad rb_num_width = 2; 1995 1.1 riastrad } else { 1996 1.1 riastrad /* eg+ */ 1997 1.1 riastrad rb_num_width = 4; 1998 1.1 riastrad } 1999 1.1 riastrad 2000 1.1 riastrad for (i = 0; i < max_rb_num; i++) { 2001 1.1 riastrad if (!(mask & disabled_rb_mask)) { 2002 1.1 riastrad for (j = 0; j < pipe_rb_ratio; j++) { 2003 1.1 riastrad data <<= rb_num_width; 2004 1.1 riastrad data |= max_rb_num - i - 1; 2005 1.1 riastrad } 2006 1.1 riastrad if (pipe_rb_remain) { 2007 1.1 riastrad data <<= rb_num_width; 2008 1.1 riastrad data |= max_rb_num - i - 1; 2009 1.1 riastrad pipe_rb_remain--; 2010 1.1 riastrad } 2011 1.1 riastrad } 2012 1.1 riastrad mask >>= 1; 2013 1.1 riastrad } 2014 1.1 riastrad 2015 1.1 riastrad return data; 2016 1.1 riastrad } 2017 1.1 riastrad 2018 1.1 riastrad int r600_count_pipe_bits(uint32_t val) 2019 1.1 riastrad { 2020 1.1 riastrad return hweight32(val); 2021 1.1 riastrad } 2022 1.1 riastrad 2023 1.1 riastrad static void r600_gpu_init(struct radeon_device *rdev) 2024 1.1 riastrad { 2025 1.1 riastrad u32 tiling_config; 2026 1.1 riastrad u32 ramcfg; 2027 1.1 riastrad u32 cc_gc_shader_pipe_config; 2028 1.1 riastrad u32 tmp; 2029 1.1 riastrad int i, j; 2030 1.1 riastrad u32 sq_config; 2031 1.1 riastrad u32 sq_gpr_resource_mgmt_1 = 0; 2032 1.1 riastrad u32 sq_gpr_resource_mgmt_2 = 0; 2033 1.1 riastrad u32 sq_thread_resource_mgmt = 0; 2034 1.1 riastrad u32 sq_stack_resource_mgmt_1 = 0; 2035 1.1 riastrad u32 sq_stack_resource_mgmt_2 = 0; 2036 1.1 riastrad u32 disabled_rb_mask; 2037 1.1 riastrad 2038 1.1 riastrad rdev->config.r600.tiling_group_size = 256; 2039 1.1 riastrad switch (rdev->family) { 2040 1.1 riastrad case CHIP_R600: 2041 1.1 riastrad rdev->config.r600.max_pipes = 4; 2042 1.1 riastrad rdev->config.r600.max_tile_pipes = 8; 2043 1.1 riastrad rdev->config.r600.max_simds = 4; 2044 1.1 riastrad rdev->config.r600.max_backends = 4; 2045 1.1 riastrad rdev->config.r600.max_gprs = 256; 2046 1.1 riastrad rdev->config.r600.max_threads = 192; 2047 1.1 riastrad rdev->config.r600.max_stack_entries = 256; 2048 1.1 riastrad rdev->config.r600.max_hw_contexts = 8; 2049 1.1 riastrad rdev->config.r600.max_gs_threads = 16; 2050 1.1 riastrad rdev->config.r600.sx_max_export_size = 128; 2051 1.1 riastrad rdev->config.r600.sx_max_export_pos_size = 16; 2052 1.1 riastrad rdev->config.r600.sx_max_export_smx_size = 128; 2053 1.1 riastrad rdev->config.r600.sq_num_cf_insts = 2; 2054 1.1 riastrad break; 2055 1.1 riastrad case CHIP_RV630: 2056 1.1 riastrad case CHIP_RV635: 2057 1.1 riastrad rdev->config.r600.max_pipes = 2; 2058 1.1 riastrad rdev->config.r600.max_tile_pipes = 2; 2059 1.1 riastrad rdev->config.r600.max_simds = 3; 2060 1.1 riastrad rdev->config.r600.max_backends = 1; 2061 1.1 riastrad rdev->config.r600.max_gprs = 128; 2062 1.1 riastrad rdev->config.r600.max_threads = 192; 2063 1.1 riastrad rdev->config.r600.max_stack_entries = 128; 2064 1.1 riastrad rdev->config.r600.max_hw_contexts = 8; 2065 1.1 riastrad rdev->config.r600.max_gs_threads = 4; 2066 1.1 riastrad rdev->config.r600.sx_max_export_size = 128; 2067 1.1 riastrad rdev->config.r600.sx_max_export_pos_size = 16; 2068 1.1 riastrad rdev->config.r600.sx_max_export_smx_size = 128; 2069 1.1 riastrad rdev->config.r600.sq_num_cf_insts = 2; 2070 1.1 riastrad break; 2071 1.1 riastrad case CHIP_RV610: 2072 1.1 riastrad case CHIP_RV620: 2073 1.1 riastrad case CHIP_RS780: 2074 1.1 riastrad case CHIP_RS880: 2075 1.1 riastrad rdev->config.r600.max_pipes = 1; 2076 1.1 riastrad rdev->config.r600.max_tile_pipes = 1; 2077 1.1 riastrad rdev->config.r600.max_simds = 2; 2078 1.1 riastrad rdev->config.r600.max_backends = 1; 2079 1.1 riastrad rdev->config.r600.max_gprs = 128; 2080 1.1 riastrad rdev->config.r600.max_threads = 192; 2081 1.1 riastrad rdev->config.r600.max_stack_entries = 128; 2082 1.1 riastrad rdev->config.r600.max_hw_contexts = 4; 2083 1.1 riastrad rdev->config.r600.max_gs_threads = 4; 2084 1.1 riastrad rdev->config.r600.sx_max_export_size = 128; 2085 1.1 riastrad rdev->config.r600.sx_max_export_pos_size = 16; 2086 1.1 riastrad rdev->config.r600.sx_max_export_smx_size = 128; 2087 1.1 riastrad rdev->config.r600.sq_num_cf_insts = 1; 2088 1.1 riastrad break; 2089 1.1 riastrad case CHIP_RV670: 2090 1.1 riastrad rdev->config.r600.max_pipes = 4; 2091 1.1 riastrad rdev->config.r600.max_tile_pipes = 4; 2092 1.1 riastrad rdev->config.r600.max_simds = 4; 2093 1.1 riastrad rdev->config.r600.max_backends = 4; 2094 1.1 riastrad rdev->config.r600.max_gprs = 192; 2095 1.1 riastrad rdev->config.r600.max_threads = 192; 2096 1.1 riastrad rdev->config.r600.max_stack_entries = 256; 2097 1.1 riastrad rdev->config.r600.max_hw_contexts = 8; 2098 1.1 riastrad rdev->config.r600.max_gs_threads = 16; 2099 1.1 riastrad rdev->config.r600.sx_max_export_size = 128; 2100 1.1 riastrad rdev->config.r600.sx_max_export_pos_size = 16; 2101 1.1 riastrad rdev->config.r600.sx_max_export_smx_size = 128; 2102 1.1 riastrad rdev->config.r600.sq_num_cf_insts = 2; 2103 1.1 riastrad break; 2104 1.1 riastrad default: 2105 1.1 riastrad break; 2106 1.1 riastrad } 2107 1.1 riastrad 2108 1.1 riastrad /* Initialize HDP */ 2109 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 2110 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 2111 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 2112 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 2113 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 2114 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 2115 1.1 riastrad } 2116 1.1 riastrad 2117 1.1 riastrad WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 2118 1.1 riastrad 2119 1.1 riastrad /* Setup tiling */ 2120 1.1 riastrad tiling_config = 0; 2121 1.1 riastrad ramcfg = RREG32(RAMCFG); 2122 1.1 riastrad switch (rdev->config.r600.max_tile_pipes) { 2123 1.1 riastrad case 1: 2124 1.1 riastrad tiling_config |= PIPE_TILING(0); 2125 1.1 riastrad break; 2126 1.1 riastrad case 2: 2127 1.1 riastrad tiling_config |= PIPE_TILING(1); 2128 1.1 riastrad break; 2129 1.1 riastrad case 4: 2130 1.1 riastrad tiling_config |= PIPE_TILING(2); 2131 1.1 riastrad break; 2132 1.1 riastrad case 8: 2133 1.1 riastrad tiling_config |= PIPE_TILING(3); 2134 1.1 riastrad break; 2135 1.1 riastrad default: 2136 1.1 riastrad break; 2137 1.1 riastrad } 2138 1.1 riastrad rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes; 2139 1.1 riastrad rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 2140 1.1 riastrad tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 2141 1.1 riastrad tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); 2142 1.1 riastrad 2143 1.1 riastrad tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT; 2144 1.1 riastrad if (tmp > 3) { 2145 1.1 riastrad tiling_config |= ROW_TILING(3); 2146 1.1 riastrad tiling_config |= SAMPLE_SPLIT(3); 2147 1.1 riastrad } else { 2148 1.1 riastrad tiling_config |= ROW_TILING(tmp); 2149 1.1 riastrad tiling_config |= SAMPLE_SPLIT(tmp); 2150 1.1 riastrad } 2151 1.1 riastrad tiling_config |= BANK_SWAPS(1); 2152 1.1 riastrad 2153 1.1 riastrad cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00; 2154 1.1 riastrad tmp = rdev->config.r600.max_simds - 2155 1.1 riastrad r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); 2156 1.1 riastrad rdev->config.r600.active_simds = tmp; 2157 1.1 riastrad 2158 1.1 riastrad disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; 2159 1.1 riastrad tmp = 0; 2160 1.1 riastrad for (i = 0; i < rdev->config.r600.max_backends; i++) 2161 1.1 riastrad tmp |= (1 << i); 2162 1.1 riastrad /* if all the backends are disabled, fix it up here */ 2163 1.1 riastrad if ((disabled_rb_mask & tmp) == tmp) { 2164 1.1 riastrad for (i = 0; i < rdev->config.r600.max_backends; i++) 2165 1.1 riastrad disabled_rb_mask &= ~(1 << i); 2166 1.1 riastrad } 2167 1.1 riastrad tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 2168 1.1 riastrad tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends, 2169 1.1 riastrad R6XX_MAX_BACKENDS, disabled_rb_mask); 2170 1.1 riastrad tiling_config |= tmp << 16; 2171 1.1 riastrad rdev->config.r600.backend_map = tmp; 2172 1.1 riastrad 2173 1.1 riastrad rdev->config.r600.tile_config = tiling_config; 2174 1.1 riastrad WREG32(GB_TILING_CONFIG, tiling_config); 2175 1.1 riastrad WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); 2176 1.1 riastrad WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff); 2177 1.1 riastrad WREG32(DMA_TILING_CONFIG, tiling_config & 0xffff); 2178 1.1 riastrad 2179 1.1 riastrad tmp = R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); 2180 1.1 riastrad WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & DEALLOC_DIST_MASK); 2181 1.1 riastrad WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & VTX_REUSE_DEPTH_MASK); 2182 1.1 riastrad 2183 1.1 riastrad /* Setup some CP states */ 2184 1.1 riastrad WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | ROQ_IB2_START(0x2b))); 2185 1.1 riastrad WREG32(CP_MEQ_THRESHOLDS, (MEQ_END(0x40) | ROQ_END(0x40))); 2186 1.1 riastrad 2187 1.1 riastrad WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | SYNC_GRADIENT | 2188 1.1 riastrad SYNC_WALKER | SYNC_ALIGNER)); 2189 1.1 riastrad /* Setup various GPU states */ 2190 1.1 riastrad if (rdev->family == CHIP_RV670) 2191 1.1 riastrad WREG32(ARB_GDEC_RD_CNTL, 0x00000021); 2192 1.1 riastrad 2193 1.1 riastrad tmp = RREG32(SX_DEBUG_1); 2194 1.1 riastrad tmp |= SMX_EVENT_RELEASE; 2195 1.1 riastrad if ((rdev->family > CHIP_R600)) 2196 1.1 riastrad tmp |= ENABLE_NEW_SMX_ADDRESS; 2197 1.1 riastrad WREG32(SX_DEBUG_1, tmp); 2198 1.1 riastrad 2199 1.1 riastrad if (((rdev->family) == CHIP_R600) || 2200 1.1 riastrad ((rdev->family) == CHIP_RV630) || 2201 1.1 riastrad ((rdev->family) == CHIP_RV610) || 2202 1.1 riastrad ((rdev->family) == CHIP_RV620) || 2203 1.1 riastrad ((rdev->family) == CHIP_RS780) || 2204 1.1 riastrad ((rdev->family) == CHIP_RS880)) { 2205 1.1 riastrad WREG32(DB_DEBUG, PREZ_MUST_WAIT_FOR_POSTZ_DONE); 2206 1.1 riastrad } else { 2207 1.1 riastrad WREG32(DB_DEBUG, 0); 2208 1.1 riastrad } 2209 1.1 riastrad WREG32(DB_WATERMARKS, (DEPTH_FREE(4) | DEPTH_CACHELINE_FREE(16) | 2210 1.1 riastrad DEPTH_FLUSH(16) | DEPTH_PENDING_FREE(4))); 2211 1.1 riastrad 2212 1.1 riastrad WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 2213 1.1 riastrad WREG32(VGT_NUM_INSTANCES, 0); 2214 1.1 riastrad 2215 1.1 riastrad WREG32(SPI_CONFIG_CNTL, GPR_WRITE_PRIORITY(0)); 2216 1.1 riastrad WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(0)); 2217 1.1 riastrad 2218 1.1 riastrad tmp = RREG32(SQ_MS_FIFO_SIZES); 2219 1.1 riastrad if (((rdev->family) == CHIP_RV610) || 2220 1.1 riastrad ((rdev->family) == CHIP_RV620) || 2221 1.1 riastrad ((rdev->family) == CHIP_RS780) || 2222 1.1 riastrad ((rdev->family) == CHIP_RS880)) { 2223 1.1 riastrad tmp = (CACHE_FIFO_SIZE(0xa) | 2224 1.1 riastrad FETCH_FIFO_HIWATER(0xa) | 2225 1.1 riastrad DONE_FIFO_HIWATER(0xe0) | 2226 1.1 riastrad ALU_UPDATE_FIFO_HIWATER(0x8)); 2227 1.1 riastrad } else if (((rdev->family) == CHIP_R600) || 2228 1.1 riastrad ((rdev->family) == CHIP_RV630)) { 2229 1.1 riastrad tmp &= ~DONE_FIFO_HIWATER(0xff); 2230 1.1 riastrad tmp |= DONE_FIFO_HIWATER(0x4); 2231 1.1 riastrad } 2232 1.1 riastrad WREG32(SQ_MS_FIFO_SIZES, tmp); 2233 1.1 riastrad 2234 1.1 riastrad /* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT 2235 1.1 riastrad * should be adjusted as needed by the 2D/3D drivers. This just sets default values 2236 1.1 riastrad */ 2237 1.1 riastrad sq_config = RREG32(SQ_CONFIG); 2238 1.1 riastrad sq_config &= ~(PS_PRIO(3) | 2239 1.1 riastrad VS_PRIO(3) | 2240 1.1 riastrad GS_PRIO(3) | 2241 1.2 msaitoh ES_PRIO(3U)); 2242 1.1 riastrad sq_config |= (DX9_CONSTS | 2243 1.1 riastrad VC_ENABLE | 2244 1.1 riastrad PS_PRIO(0) | 2245 1.1 riastrad VS_PRIO(1) | 2246 1.1 riastrad GS_PRIO(2) | 2247 1.2 msaitoh ES_PRIO(3U)); 2248 1.1 riastrad 2249 1.1 riastrad if ((rdev->family) == CHIP_R600) { 2250 1.1 riastrad sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(124) | 2251 1.1 riastrad NUM_VS_GPRS(124) | 2252 1.1 riastrad NUM_CLAUSE_TEMP_GPRS(4)); 2253 1.1 riastrad sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(0) | 2254 1.1 riastrad NUM_ES_GPRS(0)); 2255 1.1 riastrad sq_thread_resource_mgmt = (NUM_PS_THREADS(136) | 2256 1.1 riastrad NUM_VS_THREADS(48) | 2257 1.1 riastrad NUM_GS_THREADS(4) | 2258 1.1 riastrad NUM_ES_THREADS(4)); 2259 1.1 riastrad sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(128) | 2260 1.1 riastrad NUM_VS_STACK_ENTRIES(128)); 2261 1.1 riastrad sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(0) | 2262 1.1 riastrad NUM_ES_STACK_ENTRIES(0)); 2263 1.1 riastrad } else if (((rdev->family) == CHIP_RV610) || 2264 1.1 riastrad ((rdev->family) == CHIP_RV620) || 2265 1.1 riastrad ((rdev->family) == CHIP_RS780) || 2266 1.1 riastrad ((rdev->family) == CHIP_RS880)) { 2267 1.1 riastrad /* no vertex cache */ 2268 1.1 riastrad sq_config &= ~VC_ENABLE; 2269 1.1 riastrad 2270 1.1 riastrad sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) | 2271 1.1 riastrad NUM_VS_GPRS(44) | 2272 1.1 riastrad NUM_CLAUSE_TEMP_GPRS(2)); 2273 1.1 riastrad sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(17) | 2274 1.1 riastrad NUM_ES_GPRS(17)); 2275 1.1 riastrad sq_thread_resource_mgmt = (NUM_PS_THREADS(79) | 2276 1.1 riastrad NUM_VS_THREADS(78) | 2277 1.1 riastrad NUM_GS_THREADS(4) | 2278 1.1 riastrad NUM_ES_THREADS(31)); 2279 1.1 riastrad sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(40) | 2280 1.1 riastrad NUM_VS_STACK_ENTRIES(40)); 2281 1.1 riastrad sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(32) | 2282 1.1 riastrad NUM_ES_STACK_ENTRIES(16)); 2283 1.1 riastrad } else if (((rdev->family) == CHIP_RV630) || 2284 1.1 riastrad ((rdev->family) == CHIP_RV635)) { 2285 1.1 riastrad sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) | 2286 1.1 riastrad NUM_VS_GPRS(44) | 2287 1.1 riastrad NUM_CLAUSE_TEMP_GPRS(2)); 2288 1.1 riastrad sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(18) | 2289 1.1 riastrad NUM_ES_GPRS(18)); 2290 1.1 riastrad sq_thread_resource_mgmt = (NUM_PS_THREADS(79) | 2291 1.1 riastrad NUM_VS_THREADS(78) | 2292 1.1 riastrad NUM_GS_THREADS(4) | 2293 1.1 riastrad NUM_ES_THREADS(31)); 2294 1.1 riastrad sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(40) | 2295 1.1 riastrad NUM_VS_STACK_ENTRIES(40)); 2296 1.1 riastrad sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(32) | 2297 1.1 riastrad NUM_ES_STACK_ENTRIES(16)); 2298 1.1 riastrad } else if ((rdev->family) == CHIP_RV670) { 2299 1.1 riastrad sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) | 2300 1.1 riastrad NUM_VS_GPRS(44) | 2301 1.1 riastrad NUM_CLAUSE_TEMP_GPRS(2)); 2302 1.1 riastrad sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(17) | 2303 1.1 riastrad NUM_ES_GPRS(17)); 2304 1.1 riastrad sq_thread_resource_mgmt = (NUM_PS_THREADS(79) | 2305 1.1 riastrad NUM_VS_THREADS(78) | 2306 1.1 riastrad NUM_GS_THREADS(4) | 2307 1.1 riastrad NUM_ES_THREADS(31)); 2308 1.1 riastrad sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(64) | 2309 1.1 riastrad NUM_VS_STACK_ENTRIES(64)); 2310 1.1 riastrad sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(64) | 2311 1.1 riastrad NUM_ES_STACK_ENTRIES(64)); 2312 1.1 riastrad } 2313 1.1 riastrad 2314 1.1 riastrad WREG32(SQ_CONFIG, sq_config); 2315 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1); 2316 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2); 2317 1.1 riastrad WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt); 2318 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1); 2319 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2); 2320 1.1 riastrad 2321 1.1 riastrad if (((rdev->family) == CHIP_RV610) || 2322 1.1 riastrad ((rdev->family) == CHIP_RV620) || 2323 1.1 riastrad ((rdev->family) == CHIP_RS780) || 2324 1.1 riastrad ((rdev->family) == CHIP_RS880)) { 2325 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(TC_ONLY)); 2326 1.1 riastrad } else { 2327 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC)); 2328 1.1 riastrad } 2329 1.1 riastrad 2330 1.1 riastrad /* More default values. 2D/3D driver should adjust as needed */ 2331 1.1 riastrad WREG32(PA_SC_AA_SAMPLE_LOCS_2S, (S0_X(0xc) | S0_Y(0x4) | 2332 1.1 riastrad S1_X(0x4) | S1_Y(0xc))); 2333 1.1 riastrad WREG32(PA_SC_AA_SAMPLE_LOCS_4S, (S0_X(0xe) | S0_Y(0xe) | 2334 1.1 riastrad S1_X(0x2) | S1_Y(0x2) | 2335 1.1 riastrad S2_X(0xa) | S2_Y(0x6) | 2336 1.2 msaitoh S3_X(0x6) | S3_Y(0xaU))); 2337 1.1 riastrad WREG32(PA_SC_AA_SAMPLE_LOCS_8S_WD0, (S0_X(0xe) | S0_Y(0xb) | 2338 1.1 riastrad S1_X(0x4) | S1_Y(0xc) | 2339 1.1 riastrad S2_X(0x1) | S2_Y(0x6) | 2340 1.2 msaitoh S3_X(0xa) | S3_Y(0xeU))); 2341 1.1 riastrad WREG32(PA_SC_AA_SAMPLE_LOCS_8S_WD1, (S4_X(0x6) | S4_Y(0x1) | 2342 1.1 riastrad S5_X(0x0) | S5_Y(0x0) | 2343 1.1 riastrad S6_X(0xb) | S6_Y(0x4) | 2344 1.2 msaitoh S7_X(0x7) | S7_Y(0x8U))); 2345 1.1 riastrad 2346 1.1 riastrad WREG32(VGT_STRMOUT_EN, 0); 2347 1.1 riastrad tmp = rdev->config.r600.max_pipes * 16; 2348 1.1 riastrad switch (rdev->family) { 2349 1.1 riastrad case CHIP_RV610: 2350 1.1 riastrad case CHIP_RV620: 2351 1.1 riastrad case CHIP_RS780: 2352 1.1 riastrad case CHIP_RS880: 2353 1.1 riastrad tmp += 32; 2354 1.1 riastrad break; 2355 1.1 riastrad case CHIP_RV670: 2356 1.1 riastrad tmp += 128; 2357 1.1 riastrad break; 2358 1.1 riastrad default: 2359 1.1 riastrad break; 2360 1.1 riastrad } 2361 1.1 riastrad if (tmp > 256) { 2362 1.1 riastrad tmp = 256; 2363 1.1 riastrad } 2364 1.1 riastrad WREG32(VGT_ES_PER_GS, 128); 2365 1.1 riastrad WREG32(VGT_GS_PER_ES, tmp); 2366 1.1 riastrad WREG32(VGT_GS_PER_VS, 2); 2367 1.1 riastrad WREG32(VGT_GS_VERTEX_REUSE, 16); 2368 1.1 riastrad 2369 1.1 riastrad /* more default values. 2D/3D driver should adjust as needed */ 2370 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 2371 1.1 riastrad WREG32(VGT_STRMOUT_EN, 0); 2372 1.1 riastrad WREG32(SX_MISC, 0); 2373 1.1 riastrad WREG32(PA_SC_MODE_CNTL, 0); 2374 1.1 riastrad WREG32(PA_SC_AA_CONFIG, 0); 2375 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE, 0); 2376 1.1 riastrad WREG32(SPI_INPUT_Z, 0); 2377 1.1 riastrad WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2)); 2378 1.1 riastrad WREG32(CB_COLOR7_FRAG, 0); 2379 1.1 riastrad 2380 1.1 riastrad /* Clear render buffer base addresses */ 2381 1.1 riastrad WREG32(CB_COLOR0_BASE, 0); 2382 1.1 riastrad WREG32(CB_COLOR1_BASE, 0); 2383 1.1 riastrad WREG32(CB_COLOR2_BASE, 0); 2384 1.1 riastrad WREG32(CB_COLOR3_BASE, 0); 2385 1.1 riastrad WREG32(CB_COLOR4_BASE, 0); 2386 1.1 riastrad WREG32(CB_COLOR5_BASE, 0); 2387 1.1 riastrad WREG32(CB_COLOR6_BASE, 0); 2388 1.1 riastrad WREG32(CB_COLOR7_BASE, 0); 2389 1.1 riastrad WREG32(CB_COLOR7_FRAG, 0); 2390 1.1 riastrad 2391 1.1 riastrad switch (rdev->family) { 2392 1.1 riastrad case CHIP_RV610: 2393 1.1 riastrad case CHIP_RV620: 2394 1.1 riastrad case CHIP_RS780: 2395 1.1 riastrad case CHIP_RS880: 2396 1.1 riastrad tmp = TC_L2_SIZE(8); 2397 1.1 riastrad break; 2398 1.1 riastrad case CHIP_RV630: 2399 1.1 riastrad case CHIP_RV635: 2400 1.1 riastrad tmp = TC_L2_SIZE(4); 2401 1.1 riastrad break; 2402 1.1 riastrad case CHIP_R600: 2403 1.1 riastrad tmp = TC_L2_SIZE(0) | L2_DISABLE_LATE_HIT; 2404 1.1 riastrad break; 2405 1.1 riastrad default: 2406 1.1 riastrad tmp = TC_L2_SIZE(0); 2407 1.1 riastrad break; 2408 1.1 riastrad } 2409 1.1 riastrad WREG32(TC_CNTL, tmp); 2410 1.1 riastrad 2411 1.1 riastrad tmp = RREG32(HDP_HOST_PATH_CNTL); 2412 1.1 riastrad WREG32(HDP_HOST_PATH_CNTL, tmp); 2413 1.1 riastrad 2414 1.1 riastrad tmp = RREG32(ARB_POP); 2415 1.1 riastrad tmp |= ENABLE_TC128; 2416 1.1 riastrad WREG32(ARB_POP, tmp); 2417 1.1 riastrad 2418 1.1 riastrad WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 2419 1.1 riastrad WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | 2420 1.1 riastrad NUM_CLIP_SEQ(3))); 2421 1.1 riastrad WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095)); 2422 1.1 riastrad WREG32(VC_ENHANCE, 0); 2423 1.1 riastrad } 2424 1.1 riastrad 2425 1.1 riastrad 2426 1.1 riastrad /* 2427 1.1 riastrad * Indirect registers accessor 2428 1.1 riastrad */ 2429 1.1 riastrad u32 r600_pciep_rreg(struct radeon_device *rdev, u32 reg) 2430 1.1 riastrad { 2431 1.1 riastrad unsigned long flags; 2432 1.1 riastrad u32 r; 2433 1.1 riastrad 2434 1.1 riastrad spin_lock_irqsave(&rdev->pciep_idx_lock, flags); 2435 1.1 riastrad WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 2436 1.1 riastrad (void)RREG32(PCIE_PORT_INDEX); 2437 1.1 riastrad r = RREG32(PCIE_PORT_DATA); 2438 1.1 riastrad spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); 2439 1.1 riastrad return r; 2440 1.1 riastrad } 2441 1.1 riastrad 2442 1.1 riastrad void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2443 1.1 riastrad { 2444 1.1 riastrad unsigned long flags; 2445 1.1 riastrad 2446 1.1 riastrad spin_lock_irqsave(&rdev->pciep_idx_lock, flags); 2447 1.1 riastrad WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 2448 1.1 riastrad (void)RREG32(PCIE_PORT_INDEX); 2449 1.1 riastrad WREG32(PCIE_PORT_DATA, (v)); 2450 1.1 riastrad (void)RREG32(PCIE_PORT_DATA); 2451 1.1 riastrad spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); 2452 1.1 riastrad } 2453 1.1 riastrad 2454 1.1 riastrad /* 2455 1.1 riastrad * CP & Ring 2456 1.1 riastrad */ 2457 1.1 riastrad void r600_cp_stop(struct radeon_device *rdev) 2458 1.1 riastrad { 2459 1.1 riastrad if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 2460 1.1 riastrad radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 2461 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 2462 1.1 riastrad WREG32(SCRATCH_UMSK, 0); 2463 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 2464 1.1 riastrad } 2465 1.1 riastrad 2466 1.1 riastrad int r600_init_microcode(struct radeon_device *rdev) 2467 1.1 riastrad { 2468 1.1 riastrad const char *chip_name; 2469 1.1 riastrad const char *rlc_chip_name; 2470 1.1 riastrad const char *smc_chip_name = "RV770"; 2471 1.1 riastrad size_t pfp_req_size, me_req_size, rlc_req_size, smc_req_size = 0; 2472 1.1 riastrad char fw_name[30]; 2473 1.1 riastrad int err; 2474 1.1 riastrad 2475 1.1 riastrad DRM_DEBUG("\n"); 2476 1.1 riastrad 2477 1.1 riastrad switch (rdev->family) { 2478 1.1 riastrad case CHIP_R600: 2479 1.1 riastrad chip_name = "R600"; 2480 1.1 riastrad rlc_chip_name = "R600"; 2481 1.1 riastrad break; 2482 1.1 riastrad case CHIP_RV610: 2483 1.1 riastrad chip_name = "RV610"; 2484 1.1 riastrad rlc_chip_name = "R600"; 2485 1.1 riastrad break; 2486 1.1 riastrad case CHIP_RV630: 2487 1.1 riastrad chip_name = "RV630"; 2488 1.1 riastrad rlc_chip_name = "R600"; 2489 1.1 riastrad break; 2490 1.1 riastrad case CHIP_RV620: 2491 1.1 riastrad chip_name = "RV620"; 2492 1.1 riastrad rlc_chip_name = "R600"; 2493 1.1 riastrad break; 2494 1.1 riastrad case CHIP_RV635: 2495 1.1 riastrad chip_name = "RV635"; 2496 1.1 riastrad rlc_chip_name = "R600"; 2497 1.1 riastrad break; 2498 1.1 riastrad case CHIP_RV670: 2499 1.1 riastrad chip_name = "RV670"; 2500 1.1 riastrad rlc_chip_name = "R600"; 2501 1.1 riastrad break; 2502 1.1 riastrad case CHIP_RS780: 2503 1.1 riastrad case CHIP_RS880: 2504 1.1 riastrad chip_name = "RS780"; 2505 1.1 riastrad rlc_chip_name = "R600"; 2506 1.1 riastrad break; 2507 1.1 riastrad case CHIP_RV770: 2508 1.1 riastrad chip_name = "RV770"; 2509 1.1 riastrad rlc_chip_name = "R700"; 2510 1.1 riastrad smc_chip_name = "RV770"; 2511 1.1 riastrad smc_req_size = ALIGN(RV770_SMC_UCODE_SIZE, 4); 2512 1.1 riastrad break; 2513 1.1 riastrad case CHIP_RV730: 2514 1.1 riastrad chip_name = "RV730"; 2515 1.1 riastrad rlc_chip_name = "R700"; 2516 1.1 riastrad smc_chip_name = "RV730"; 2517 1.1 riastrad smc_req_size = ALIGN(RV730_SMC_UCODE_SIZE, 4); 2518 1.1 riastrad break; 2519 1.1 riastrad case CHIP_RV710: 2520 1.1 riastrad chip_name = "RV710"; 2521 1.1 riastrad rlc_chip_name = "R700"; 2522 1.1 riastrad smc_chip_name = "RV710"; 2523 1.1 riastrad smc_req_size = ALIGN(RV710_SMC_UCODE_SIZE, 4); 2524 1.1 riastrad break; 2525 1.1 riastrad case CHIP_RV740: 2526 1.1 riastrad chip_name = "RV730"; 2527 1.1 riastrad rlc_chip_name = "R700"; 2528 1.1 riastrad smc_chip_name = "RV740"; 2529 1.1 riastrad smc_req_size = ALIGN(RV740_SMC_UCODE_SIZE, 4); 2530 1.1 riastrad break; 2531 1.1 riastrad case CHIP_CEDAR: 2532 1.1 riastrad chip_name = "CEDAR"; 2533 1.1 riastrad rlc_chip_name = "CEDAR"; 2534 1.1 riastrad smc_chip_name = "CEDAR"; 2535 1.1 riastrad smc_req_size = ALIGN(CEDAR_SMC_UCODE_SIZE, 4); 2536 1.1 riastrad break; 2537 1.1 riastrad case CHIP_REDWOOD: 2538 1.1 riastrad chip_name = "REDWOOD"; 2539 1.1 riastrad rlc_chip_name = "REDWOOD"; 2540 1.1 riastrad smc_chip_name = "REDWOOD"; 2541 1.1 riastrad smc_req_size = ALIGN(REDWOOD_SMC_UCODE_SIZE, 4); 2542 1.1 riastrad break; 2543 1.1 riastrad case CHIP_JUNIPER: 2544 1.1 riastrad chip_name = "JUNIPER"; 2545 1.1 riastrad rlc_chip_name = "JUNIPER"; 2546 1.1 riastrad smc_chip_name = "JUNIPER"; 2547 1.1 riastrad smc_req_size = ALIGN(JUNIPER_SMC_UCODE_SIZE, 4); 2548 1.1 riastrad break; 2549 1.1 riastrad case CHIP_CYPRESS: 2550 1.1 riastrad case CHIP_HEMLOCK: 2551 1.1 riastrad chip_name = "CYPRESS"; 2552 1.1 riastrad rlc_chip_name = "CYPRESS"; 2553 1.1 riastrad smc_chip_name = "CYPRESS"; 2554 1.1 riastrad smc_req_size = ALIGN(CYPRESS_SMC_UCODE_SIZE, 4); 2555 1.1 riastrad break; 2556 1.1 riastrad case CHIP_PALM: 2557 1.1 riastrad chip_name = "PALM"; 2558 1.1 riastrad rlc_chip_name = "SUMO"; 2559 1.1 riastrad break; 2560 1.1 riastrad case CHIP_SUMO: 2561 1.1 riastrad chip_name = "SUMO"; 2562 1.1 riastrad rlc_chip_name = "SUMO"; 2563 1.1 riastrad break; 2564 1.1 riastrad case CHIP_SUMO2: 2565 1.1 riastrad chip_name = "SUMO2"; 2566 1.1 riastrad rlc_chip_name = "SUMO"; 2567 1.1 riastrad break; 2568 1.1 riastrad default: BUG(); 2569 1.1 riastrad } 2570 1.1 riastrad 2571 1.1 riastrad if (rdev->family >= CHIP_CEDAR) { 2572 1.1 riastrad pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 2573 1.1 riastrad me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 2574 1.1 riastrad rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 2575 1.1 riastrad } else if (rdev->family >= CHIP_RV770) { 2576 1.1 riastrad pfp_req_size = R700_PFP_UCODE_SIZE * 4; 2577 1.1 riastrad me_req_size = R700_PM4_UCODE_SIZE * 4; 2578 1.1 riastrad rlc_req_size = R700_RLC_UCODE_SIZE * 4; 2579 1.1 riastrad } else { 2580 1.1 riastrad pfp_req_size = R600_PFP_UCODE_SIZE * 4; 2581 1.1 riastrad me_req_size = R600_PM4_UCODE_SIZE * 12; 2582 1.1 riastrad rlc_req_size = R600_RLC_UCODE_SIZE * 4; 2583 1.1 riastrad } 2584 1.1 riastrad 2585 1.1 riastrad DRM_INFO("Loading %s Microcode\n", chip_name); 2586 1.1 riastrad 2587 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 2588 1.1 riastrad err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 2589 1.1 riastrad if (err) 2590 1.1 riastrad goto out; 2591 1.1 riastrad if (rdev->pfp_fw->size != pfp_req_size) { 2592 1.6 riastrad pr_err("r600_cp: Bogus length %zu in firmware \"%s\"\n", 2593 1.1 riastrad rdev->pfp_fw->size, fw_name); 2594 1.1 riastrad err = -EINVAL; 2595 1.1 riastrad goto out; 2596 1.1 riastrad } 2597 1.1 riastrad 2598 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 2599 1.1 riastrad err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 2600 1.1 riastrad if (err) 2601 1.1 riastrad goto out; 2602 1.1 riastrad if (rdev->me_fw->size != me_req_size) { 2603 1.6 riastrad pr_err("r600_cp: Bogus length %zu in firmware \"%s\"\n", 2604 1.1 riastrad rdev->me_fw->size, fw_name); 2605 1.1 riastrad err = -EINVAL; 2606 1.1 riastrad } 2607 1.1 riastrad 2608 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); 2609 1.1 riastrad err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 2610 1.1 riastrad if (err) 2611 1.1 riastrad goto out; 2612 1.1 riastrad if (rdev->rlc_fw->size != rlc_req_size) { 2613 1.6 riastrad pr_err("r600_rlc: Bogus length %zu in firmware \"%s\"\n", 2614 1.1 riastrad rdev->rlc_fw->size, fw_name); 2615 1.1 riastrad err = -EINVAL; 2616 1.1 riastrad } 2617 1.1 riastrad 2618 1.1 riastrad if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) { 2619 1.1 riastrad snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name); 2620 1.1 riastrad err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 2621 1.1 riastrad if (err) { 2622 1.6 riastrad pr_err("smc: error loading firmware \"%s\"\n", fw_name); 2623 1.1 riastrad release_firmware(rdev->smc_fw); 2624 1.1 riastrad rdev->smc_fw = NULL; 2625 1.1 riastrad err = 0; 2626 1.1 riastrad } else if (rdev->smc_fw->size != smc_req_size) { 2627 1.6 riastrad pr_err("smc: Bogus length %zu in firmware \"%s\"\n", 2628 1.1 riastrad rdev->smc_fw->size, fw_name); 2629 1.1 riastrad err = -EINVAL; 2630 1.1 riastrad } 2631 1.1 riastrad } 2632 1.1 riastrad 2633 1.1 riastrad out: 2634 1.1 riastrad if (err) { 2635 1.1 riastrad if (err != -EINVAL) 2636 1.6 riastrad pr_err("r600_cp: Failed to load firmware \"%s\"\n", 2637 1.1 riastrad fw_name); 2638 1.1 riastrad release_firmware(rdev->pfp_fw); 2639 1.1 riastrad rdev->pfp_fw = NULL; 2640 1.1 riastrad release_firmware(rdev->me_fw); 2641 1.1 riastrad rdev->me_fw = NULL; 2642 1.1 riastrad release_firmware(rdev->rlc_fw); 2643 1.1 riastrad rdev->rlc_fw = NULL; 2644 1.1 riastrad release_firmware(rdev->smc_fw); 2645 1.1 riastrad rdev->smc_fw = NULL; 2646 1.1 riastrad } 2647 1.1 riastrad return err; 2648 1.1 riastrad } 2649 1.1 riastrad 2650 1.1 riastrad u32 r600_gfx_get_rptr(struct radeon_device *rdev, 2651 1.1 riastrad struct radeon_ring *ring) 2652 1.1 riastrad { 2653 1.1 riastrad u32 rptr; 2654 1.1 riastrad 2655 1.1 riastrad if (rdev->wb.enabled) 2656 1.1 riastrad rptr = rdev->wb.wb[ring->rptr_offs/4]; 2657 1.1 riastrad else 2658 1.1 riastrad rptr = RREG32(R600_CP_RB_RPTR); 2659 1.1 riastrad 2660 1.1 riastrad return rptr; 2661 1.1 riastrad } 2662 1.1 riastrad 2663 1.1 riastrad u32 r600_gfx_get_wptr(struct radeon_device *rdev, 2664 1.1 riastrad struct radeon_ring *ring) 2665 1.1 riastrad { 2666 1.6 riastrad return RREG32(R600_CP_RB_WPTR); 2667 1.1 riastrad } 2668 1.1 riastrad 2669 1.1 riastrad void r600_gfx_set_wptr(struct radeon_device *rdev, 2670 1.1 riastrad struct radeon_ring *ring) 2671 1.1 riastrad { 2672 1.1 riastrad WREG32(R600_CP_RB_WPTR, ring->wptr); 2673 1.1 riastrad (void)RREG32(R600_CP_RB_WPTR); 2674 1.1 riastrad } 2675 1.1 riastrad 2676 1.1 riastrad static int r600_cp_load_microcode(struct radeon_device *rdev) 2677 1.1 riastrad { 2678 1.1 riastrad const __be32 *fw_data; 2679 1.1 riastrad int i; 2680 1.1 riastrad 2681 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw) 2682 1.1 riastrad return -EINVAL; 2683 1.1 riastrad 2684 1.1 riastrad r600_cp_stop(rdev); 2685 1.1 riastrad 2686 1.1 riastrad WREG32(CP_RB_CNTL, 2687 1.1 riastrad #ifdef __BIG_ENDIAN 2688 1.1 riastrad BUF_SWAP_32BIT | 2689 1.1 riastrad #endif 2690 1.1 riastrad RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); 2691 1.1 riastrad 2692 1.1 riastrad /* Reset cp */ 2693 1.1 riastrad WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 2694 1.1 riastrad RREG32(GRBM_SOFT_RESET); 2695 1.1 riastrad mdelay(15); 2696 1.1 riastrad WREG32(GRBM_SOFT_RESET, 0); 2697 1.1 riastrad 2698 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 2699 1.1 riastrad 2700 1.1 riastrad fw_data = (const __be32 *)rdev->me_fw->data; 2701 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 2702 1.1 riastrad for (i = 0; i < R600_PM4_UCODE_SIZE * 3; i++) 2703 1.1 riastrad WREG32(CP_ME_RAM_DATA, 2704 1.1 riastrad be32_to_cpup(fw_data++)); 2705 1.1 riastrad 2706 1.1 riastrad fw_data = (const __be32 *)rdev->pfp_fw->data; 2707 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 2708 1.1 riastrad for (i = 0; i < R600_PFP_UCODE_SIZE; i++) 2709 1.1 riastrad WREG32(CP_PFP_UCODE_DATA, 2710 1.1 riastrad be32_to_cpup(fw_data++)); 2711 1.1 riastrad 2712 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 2713 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 2714 1.1 riastrad WREG32(CP_ME_RAM_RADDR, 0); 2715 1.1 riastrad return 0; 2716 1.1 riastrad } 2717 1.1 riastrad 2718 1.1 riastrad int r600_cp_start(struct radeon_device *rdev) 2719 1.1 riastrad { 2720 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2721 1.1 riastrad int r; 2722 1.1 riastrad uint32_t cp_me; 2723 1.1 riastrad 2724 1.1 riastrad r = radeon_ring_lock(rdev, ring, 7); 2725 1.1 riastrad if (r) { 2726 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 2727 1.1 riastrad return r; 2728 1.1 riastrad } 2729 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5)); 2730 1.1 riastrad radeon_ring_write(ring, 0x1); 2731 1.1 riastrad if (rdev->family >= CHIP_RV770) { 2732 1.1 riastrad radeon_ring_write(ring, 0x0); 2733 1.1 riastrad radeon_ring_write(ring, rdev->config.rv770.max_hw_contexts - 1); 2734 1.1 riastrad } else { 2735 1.1 riastrad radeon_ring_write(ring, 0x3); 2736 1.1 riastrad radeon_ring_write(ring, rdev->config.r600.max_hw_contexts - 1); 2737 1.1 riastrad } 2738 1.1 riastrad radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); 2739 1.1 riastrad radeon_ring_write(ring, 0); 2740 1.1 riastrad radeon_ring_write(ring, 0); 2741 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 2742 1.1 riastrad 2743 1.1 riastrad cp_me = 0xff; 2744 1.1 riastrad WREG32(R_0086D8_CP_ME_CNTL, cp_me); 2745 1.1 riastrad return 0; 2746 1.1 riastrad } 2747 1.1 riastrad 2748 1.1 riastrad int r600_cp_resume(struct radeon_device *rdev) 2749 1.1 riastrad { 2750 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2751 1.1 riastrad u32 tmp; 2752 1.1 riastrad u32 rb_bufsz; 2753 1.1 riastrad int r; 2754 1.1 riastrad 2755 1.1 riastrad /* Reset cp */ 2756 1.1 riastrad WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 2757 1.1 riastrad RREG32(GRBM_SOFT_RESET); 2758 1.1 riastrad mdelay(15); 2759 1.1 riastrad WREG32(GRBM_SOFT_RESET, 0); 2760 1.1 riastrad 2761 1.1 riastrad /* Set ring buffer size */ 2762 1.1 riastrad rb_bufsz = order_base_2(ring->ring_size / 8); 2763 1.1 riastrad tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; 2764 1.1 riastrad #ifdef __BIG_ENDIAN 2765 1.1 riastrad tmp |= BUF_SWAP_32BIT; 2766 1.1 riastrad #endif 2767 1.1 riastrad WREG32(CP_RB_CNTL, tmp); 2768 1.1 riastrad WREG32(CP_SEM_WAIT_TIMER, 0x0); 2769 1.1 riastrad 2770 1.1 riastrad /* Set the write pointer delay */ 2771 1.1 riastrad WREG32(CP_RB_WPTR_DELAY, 0); 2772 1.1 riastrad 2773 1.1 riastrad /* Initialize the ring buffer's read and write pointers */ 2774 1.1 riastrad WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); 2775 1.1 riastrad WREG32(CP_RB_RPTR_WR, 0); 2776 1.1 riastrad ring->wptr = 0; 2777 1.1 riastrad WREG32(CP_RB_WPTR, ring->wptr); 2778 1.1 riastrad 2779 1.1 riastrad /* set the wb address whether it's enabled or not */ 2780 1.1 riastrad WREG32(CP_RB_RPTR_ADDR, 2781 1.1 riastrad ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); 2782 1.1 riastrad WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); 2783 1.1 riastrad WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); 2784 1.1 riastrad 2785 1.1 riastrad if (rdev->wb.enabled) 2786 1.1 riastrad WREG32(SCRATCH_UMSK, 0xff); 2787 1.1 riastrad else { 2788 1.1 riastrad tmp |= RB_NO_UPDATE; 2789 1.1 riastrad WREG32(SCRATCH_UMSK, 0); 2790 1.1 riastrad } 2791 1.1 riastrad 2792 1.1 riastrad mdelay(1); 2793 1.1 riastrad WREG32(CP_RB_CNTL, tmp); 2794 1.1 riastrad 2795 1.1 riastrad WREG32(CP_RB_BASE, ring->gpu_addr >> 8); 2796 1.1 riastrad WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); 2797 1.1 riastrad 2798 1.1 riastrad r600_cp_start(rdev); 2799 1.1 riastrad ring->ready = true; 2800 1.1 riastrad r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); 2801 1.1 riastrad if (r) { 2802 1.1 riastrad ring->ready = false; 2803 1.1 riastrad return r; 2804 1.1 riastrad } 2805 1.1 riastrad 2806 1.1 riastrad if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 2807 1.1 riastrad radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 2808 1.1 riastrad 2809 1.1 riastrad return 0; 2810 1.1 riastrad } 2811 1.1 riastrad 2812 1.1 riastrad void r600_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size) 2813 1.1 riastrad { 2814 1.1 riastrad u32 rb_bufsz; 2815 1.1 riastrad int r; 2816 1.1 riastrad 2817 1.1 riastrad /* Align ring size */ 2818 1.1 riastrad rb_bufsz = order_base_2(ring_size / 8); 2819 1.1 riastrad ring_size = (1 << (rb_bufsz + 1)) * 4; 2820 1.1 riastrad ring->ring_size = ring_size; 2821 1.1 riastrad ring->align_mask = 16 - 1; 2822 1.1 riastrad 2823 1.1 riastrad if (radeon_ring_supports_scratch_reg(rdev, ring)) { 2824 1.1 riastrad r = radeon_scratch_get(rdev, &ring->rptr_save_reg); 2825 1.1 riastrad if (r) { 2826 1.1 riastrad DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); 2827 1.1 riastrad ring->rptr_save_reg = 0; 2828 1.1 riastrad } 2829 1.1 riastrad } 2830 1.1 riastrad } 2831 1.1 riastrad 2832 1.1 riastrad void r600_cp_fini(struct radeon_device *rdev) 2833 1.1 riastrad { 2834 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2835 1.1 riastrad r600_cp_stop(rdev); 2836 1.1 riastrad radeon_ring_fini(rdev, ring); 2837 1.1 riastrad radeon_scratch_free(rdev, ring->rptr_save_reg); 2838 1.1 riastrad } 2839 1.1 riastrad 2840 1.1 riastrad /* 2841 1.1 riastrad * GPU scratch registers helpers function. 2842 1.1 riastrad */ 2843 1.1 riastrad void r600_scratch_init(struct radeon_device *rdev) 2844 1.1 riastrad { 2845 1.1 riastrad int i; 2846 1.1 riastrad 2847 1.1 riastrad rdev->scratch.num_reg = 7; 2848 1.1 riastrad rdev->scratch.reg_base = SCRATCH_REG0; 2849 1.1 riastrad for (i = 0; i < rdev->scratch.num_reg; i++) { 2850 1.1 riastrad rdev->scratch.free[i] = true; 2851 1.1 riastrad rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4); 2852 1.1 riastrad } 2853 1.1 riastrad } 2854 1.1 riastrad 2855 1.1 riastrad int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *ring) 2856 1.1 riastrad { 2857 1.1 riastrad uint32_t scratch; 2858 1.1 riastrad uint32_t tmp = 0; 2859 1.1 riastrad unsigned i; 2860 1.1 riastrad int r; 2861 1.1 riastrad 2862 1.1 riastrad r = radeon_scratch_get(rdev, &scratch); 2863 1.1 riastrad if (r) { 2864 1.1 riastrad DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r); 2865 1.1 riastrad return r; 2866 1.1 riastrad } 2867 1.1 riastrad WREG32(scratch, 0xCAFEDEAD); 2868 1.1 riastrad r = radeon_ring_lock(rdev, ring, 3); 2869 1.1 riastrad if (r) { 2870 1.1 riastrad DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r); 2871 1.1 riastrad radeon_scratch_free(rdev, scratch); 2872 1.1 riastrad return r; 2873 1.1 riastrad } 2874 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2875 1.1 riastrad radeon_ring_write(ring, ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 2876 1.1 riastrad radeon_ring_write(ring, 0xDEADBEEF); 2877 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 2878 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 2879 1.1 riastrad tmp = RREG32(scratch); 2880 1.1 riastrad if (tmp == 0xDEADBEEF) 2881 1.1 riastrad break; 2882 1.6 riastrad udelay(1); 2883 1.1 riastrad } 2884 1.1 riastrad if (i < rdev->usec_timeout) { 2885 1.1 riastrad DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i); 2886 1.1 riastrad } else { 2887 1.1 riastrad DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n", 2888 1.1 riastrad ring->idx, scratch, tmp); 2889 1.1 riastrad r = -EINVAL; 2890 1.1 riastrad } 2891 1.1 riastrad radeon_scratch_free(rdev, scratch); 2892 1.1 riastrad return r; 2893 1.1 riastrad } 2894 1.1 riastrad 2895 1.1 riastrad /* 2896 1.1 riastrad * CP fences/semaphores 2897 1.1 riastrad */ 2898 1.1 riastrad 2899 1.1 riastrad void r600_fence_ring_emit(struct radeon_device *rdev, 2900 1.1 riastrad struct radeon_fence *fence) 2901 1.1 riastrad { 2902 1.1 riastrad struct radeon_ring *ring = &rdev->ring[fence->ring]; 2903 1.1 riastrad u32 cp_coher_cntl = PACKET3_TC_ACTION_ENA | PACKET3_VC_ACTION_ENA | 2904 1.1 riastrad PACKET3_SH_ACTION_ENA; 2905 1.1 riastrad 2906 1.1 riastrad if (rdev->family >= CHIP_RV770) 2907 1.1 riastrad cp_coher_cntl |= PACKET3_FULL_CACHE_ENA; 2908 1.1 riastrad 2909 1.1 riastrad if (rdev->wb.use_event) { 2910 1.1 riastrad u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 2911 1.1 riastrad /* flush read cache over gart */ 2912 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 2913 1.1 riastrad radeon_ring_write(ring, cp_coher_cntl); 2914 1.1 riastrad radeon_ring_write(ring, 0xFFFFFFFF); 2915 1.1 riastrad radeon_ring_write(ring, 0); 2916 1.1 riastrad radeon_ring_write(ring, 10); /* poll interval */ 2917 1.1 riastrad /* EVENT_WRITE_EOP - flush caches, send int */ 2918 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 2919 1.1 riastrad radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 2920 1.1 riastrad radeon_ring_write(ring, lower_32_bits(addr)); 2921 1.1 riastrad radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 2922 1.1 riastrad radeon_ring_write(ring, fence->seq); 2923 1.1 riastrad radeon_ring_write(ring, 0); 2924 1.1 riastrad } else { 2925 1.1 riastrad /* flush read cache over gart */ 2926 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 2927 1.1 riastrad radeon_ring_write(ring, cp_coher_cntl); 2928 1.1 riastrad radeon_ring_write(ring, 0xFFFFFFFF); 2929 1.1 riastrad radeon_ring_write(ring, 0); 2930 1.1 riastrad radeon_ring_write(ring, 10); /* poll interval */ 2931 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); 2932 1.1 riastrad radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0)); 2933 1.1 riastrad /* wait for 3D idle clean */ 2934 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2935 1.1 riastrad radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); 2936 1.1 riastrad radeon_ring_write(ring, WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit); 2937 1.1 riastrad /* Emit fence sequence & fire IRQ */ 2938 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2939 1.1 riastrad radeon_ring_write(ring, ((rdev->fence_drv[fence->ring].scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 2940 1.1 riastrad radeon_ring_write(ring, fence->seq); 2941 1.1 riastrad /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ 2942 1.1 riastrad radeon_ring_write(ring, PACKET0(CP_INT_STATUS, 0)); 2943 1.1 riastrad radeon_ring_write(ring, RB_INT_STAT); 2944 1.1 riastrad } 2945 1.1 riastrad } 2946 1.1 riastrad 2947 1.1 riastrad /** 2948 1.1 riastrad * r600_semaphore_ring_emit - emit a semaphore on the CP ring 2949 1.1 riastrad * 2950 1.1 riastrad * @rdev: radeon_device pointer 2951 1.1 riastrad * @ring: radeon ring buffer object 2952 1.1 riastrad * @semaphore: radeon semaphore object 2953 1.1 riastrad * @emit_wait: Is this a sempahore wait? 2954 1.1 riastrad * 2955 1.1 riastrad * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP 2956 1.1 riastrad * from running ahead of semaphore waits. 2957 1.1 riastrad */ 2958 1.1 riastrad bool r600_semaphore_ring_emit(struct radeon_device *rdev, 2959 1.1 riastrad struct radeon_ring *ring, 2960 1.1 riastrad struct radeon_semaphore *semaphore, 2961 1.1 riastrad bool emit_wait) 2962 1.1 riastrad { 2963 1.1 riastrad uint64_t addr = semaphore->gpu_addr; 2964 1.1 riastrad unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; 2965 1.1 riastrad 2966 1.1 riastrad if (rdev->family < CHIP_CAYMAN) 2967 1.1 riastrad sel |= PACKET3_SEM_WAIT_ON_SIGNAL; 2968 1.1 riastrad 2969 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); 2970 1.1 riastrad radeon_ring_write(ring, lower_32_bits(addr)); 2971 1.1 riastrad radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); 2972 1.1 riastrad 2973 1.1 riastrad /* PFP_SYNC_ME packet only exists on 7xx+, only enable it on eg+ */ 2974 1.1 riastrad if (emit_wait && (rdev->family >= CHIP_CEDAR)) { 2975 1.1 riastrad /* Prevent the PFP from running ahead of the semaphore wait */ 2976 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2977 1.1 riastrad radeon_ring_write(ring, 0x0); 2978 1.1 riastrad } 2979 1.1 riastrad 2980 1.1 riastrad return true; 2981 1.1 riastrad } 2982 1.1 riastrad 2983 1.1 riastrad /** 2984 1.1 riastrad * r600_copy_cpdma - copy pages using the CP DMA engine 2985 1.1 riastrad * 2986 1.1 riastrad * @rdev: radeon_device pointer 2987 1.1 riastrad * @src_offset: src GPU address 2988 1.1 riastrad * @dst_offset: dst GPU address 2989 1.1 riastrad * @num_gpu_pages: number of GPU pages to xfer 2990 1.1 riastrad * @fence: radeon fence object 2991 1.1 riastrad * 2992 1.1 riastrad * Copy GPU paging using the CP DMA engine (r6xx+). 2993 1.1 riastrad * Used by the radeon ttm implementation to move pages if 2994 1.1 riastrad * registered as the asic copy callback. 2995 1.1 riastrad */ 2996 1.1 riastrad struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev, 2997 1.1 riastrad uint64_t src_offset, uint64_t dst_offset, 2998 1.1 riastrad unsigned num_gpu_pages, 2999 1.6 riastrad struct dma_resv *resv) 3000 1.1 riastrad { 3001 1.1 riastrad struct radeon_fence *fence; 3002 1.1 riastrad struct radeon_sync sync; 3003 1.1 riastrad int ring_index = rdev->asic->copy.blit_ring_index; 3004 1.1 riastrad struct radeon_ring *ring = &rdev->ring[ring_index]; 3005 1.1 riastrad u32 size_in_bytes, cur_size_in_bytes, tmp; 3006 1.1 riastrad int i, num_loops; 3007 1.1 riastrad int r = 0; 3008 1.1 riastrad 3009 1.1 riastrad radeon_sync_create(&sync); 3010 1.1 riastrad 3011 1.1 riastrad size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT); 3012 1.1 riastrad num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff); 3013 1.1 riastrad r = radeon_ring_lock(rdev, ring, num_loops * 6 + 24); 3014 1.1 riastrad if (r) { 3015 1.1 riastrad DRM_ERROR("radeon: moving bo (%d).\n", r); 3016 1.1 riastrad radeon_sync_free(rdev, &sync, NULL); 3017 1.1 riastrad return ERR_PTR(r); 3018 1.1 riastrad } 3019 1.1 riastrad 3020 1.1 riastrad radeon_sync_resv(rdev, &sync, resv, false); 3021 1.1 riastrad radeon_sync_rings(rdev, &sync, ring->idx); 3022 1.1 riastrad 3023 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 3024 1.1 riastrad radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); 3025 1.1 riastrad radeon_ring_write(ring, WAIT_3D_IDLE_bit); 3026 1.1 riastrad for (i = 0; i < num_loops; i++) { 3027 1.1 riastrad cur_size_in_bytes = size_in_bytes; 3028 1.1 riastrad if (cur_size_in_bytes > 0x1fffff) 3029 1.1 riastrad cur_size_in_bytes = 0x1fffff; 3030 1.1 riastrad size_in_bytes -= cur_size_in_bytes; 3031 1.1 riastrad tmp = upper_32_bits(src_offset) & 0xff; 3032 1.1 riastrad if (size_in_bytes == 0) 3033 1.1 riastrad tmp |= PACKET3_CP_DMA_CP_SYNC; 3034 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_CP_DMA, 4)); 3035 1.1 riastrad radeon_ring_write(ring, lower_32_bits(src_offset)); 3036 1.1 riastrad radeon_ring_write(ring, tmp); 3037 1.1 riastrad radeon_ring_write(ring, lower_32_bits(dst_offset)); 3038 1.1 riastrad radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); 3039 1.1 riastrad radeon_ring_write(ring, cur_size_in_bytes); 3040 1.1 riastrad src_offset += cur_size_in_bytes; 3041 1.1 riastrad dst_offset += cur_size_in_bytes; 3042 1.1 riastrad } 3043 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 3044 1.1 riastrad radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); 3045 1.1 riastrad radeon_ring_write(ring, WAIT_CP_DMA_IDLE_bit); 3046 1.1 riastrad 3047 1.1 riastrad r = radeon_fence_emit(rdev, &fence, ring->idx); 3048 1.1 riastrad if (r) { 3049 1.1 riastrad radeon_ring_unlock_undo(rdev, ring); 3050 1.1 riastrad radeon_sync_free(rdev, &sync, NULL); 3051 1.1 riastrad return ERR_PTR(r); 3052 1.1 riastrad } 3053 1.1 riastrad 3054 1.1 riastrad radeon_ring_unlock_commit(rdev, ring, false); 3055 1.1 riastrad radeon_sync_free(rdev, &sync, fence); 3056 1.1 riastrad 3057 1.1 riastrad return fence; 3058 1.1 riastrad } 3059 1.1 riastrad 3060 1.1 riastrad int r600_set_surface_reg(struct radeon_device *rdev, int reg, 3061 1.1 riastrad uint32_t tiling_flags, uint32_t pitch, 3062 1.1 riastrad uint32_t offset, uint32_t obj_size) 3063 1.1 riastrad { 3064 1.1 riastrad /* FIXME: implement */ 3065 1.1 riastrad return 0; 3066 1.1 riastrad } 3067 1.1 riastrad 3068 1.1 riastrad void r600_clear_surface_reg(struct radeon_device *rdev, int reg) 3069 1.1 riastrad { 3070 1.1 riastrad /* FIXME: implement */ 3071 1.1 riastrad } 3072 1.1 riastrad 3073 1.6 riastrad static void r600_uvd_init(struct radeon_device *rdev) 3074 1.6 riastrad { 3075 1.6 riastrad int r; 3076 1.6 riastrad 3077 1.6 riastrad if (!rdev->has_uvd) 3078 1.6 riastrad return; 3079 1.6 riastrad 3080 1.6 riastrad r = radeon_uvd_init(rdev); 3081 1.6 riastrad if (r) { 3082 1.6 riastrad dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 3083 1.6 riastrad /* 3084 1.6 riastrad * At this point rdev->uvd.vcpu_bo is NULL which trickles down 3085 1.6 riastrad * to early fails uvd_v1_0_resume() and thus nothing happens 3086 1.6 riastrad * there. So it is pointless to try to go through that code 3087 1.6 riastrad * hence why we disable uvd here. 3088 1.6 riastrad */ 3089 1.6 riastrad rdev->has_uvd = false; 3090 1.6 riastrad return; 3091 1.6 riastrad } 3092 1.6 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 3093 1.6 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 3094 1.6 riastrad } 3095 1.6 riastrad 3096 1.6 riastrad static void r600_uvd_start(struct radeon_device *rdev) 3097 1.6 riastrad { 3098 1.6 riastrad int r; 3099 1.6 riastrad 3100 1.6 riastrad if (!rdev->has_uvd) 3101 1.6 riastrad return; 3102 1.6 riastrad 3103 1.6 riastrad r = uvd_v1_0_resume(rdev); 3104 1.6 riastrad if (r) { 3105 1.6 riastrad dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 3106 1.6 riastrad goto error; 3107 1.6 riastrad } 3108 1.6 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 3109 1.6 riastrad if (r) { 3110 1.6 riastrad dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 3111 1.6 riastrad goto error; 3112 1.6 riastrad } 3113 1.6 riastrad return; 3114 1.6 riastrad 3115 1.6 riastrad error: 3116 1.6 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 3117 1.6 riastrad } 3118 1.6 riastrad 3119 1.6 riastrad static void r600_uvd_resume(struct radeon_device *rdev) 3120 1.6 riastrad { 3121 1.6 riastrad struct radeon_ring *ring; 3122 1.6 riastrad int r; 3123 1.6 riastrad 3124 1.6 riastrad if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 3125 1.6 riastrad return; 3126 1.6 riastrad 3127 1.6 riastrad ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 3128 1.6 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 3129 1.6 riastrad if (r) { 3130 1.6 riastrad dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 3131 1.6 riastrad return; 3132 1.6 riastrad } 3133 1.6 riastrad r = uvd_v1_0_init(rdev); 3134 1.6 riastrad if (r) { 3135 1.6 riastrad dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 3136 1.6 riastrad return; 3137 1.6 riastrad } 3138 1.6 riastrad } 3139 1.6 riastrad 3140 1.1 riastrad static int r600_startup(struct radeon_device *rdev) 3141 1.1 riastrad { 3142 1.1 riastrad struct radeon_ring *ring; 3143 1.1 riastrad int r; 3144 1.1 riastrad 3145 1.1 riastrad /* enable pcie gen2 link */ 3146 1.1 riastrad r600_pcie_gen2_enable(rdev); 3147 1.1 riastrad 3148 1.1 riastrad /* scratch needs to be initialized before MC */ 3149 1.1 riastrad r = r600_vram_scratch_init(rdev); 3150 1.1 riastrad if (r) 3151 1.1 riastrad return r; 3152 1.1 riastrad 3153 1.1 riastrad r600_mc_program(rdev); 3154 1.1 riastrad 3155 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 3156 1.1 riastrad r600_agp_enable(rdev); 3157 1.1 riastrad } else { 3158 1.1 riastrad r = r600_pcie_gart_enable(rdev); 3159 1.1 riastrad if (r) 3160 1.1 riastrad return r; 3161 1.1 riastrad } 3162 1.1 riastrad r600_gpu_init(rdev); 3163 1.1 riastrad 3164 1.1 riastrad /* allocate wb buffer */ 3165 1.1 riastrad r = radeon_wb_init(rdev); 3166 1.1 riastrad if (r) 3167 1.1 riastrad return r; 3168 1.1 riastrad 3169 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 3170 1.1 riastrad if (r) { 3171 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 3172 1.1 riastrad return r; 3173 1.1 riastrad } 3174 1.1 riastrad 3175 1.6 riastrad r600_uvd_start(rdev); 3176 1.1 riastrad 3177 1.1 riastrad /* Enable IRQ */ 3178 1.1 riastrad if (!rdev->irq.installed) { 3179 1.1 riastrad r = radeon_irq_kms_init(rdev); 3180 1.1 riastrad if (r) 3181 1.1 riastrad return r; 3182 1.1 riastrad } 3183 1.1 riastrad 3184 1.1 riastrad r = r600_irq_init(rdev); 3185 1.1 riastrad if (r) { 3186 1.1 riastrad DRM_ERROR("radeon: IH init failed (%d).\n", r); 3187 1.1 riastrad radeon_irq_kms_fini(rdev); 3188 1.1 riastrad return r; 3189 1.1 riastrad } 3190 1.1 riastrad r600_irq_set(rdev); 3191 1.1 riastrad 3192 1.1 riastrad ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 3193 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 3194 1.1 riastrad RADEON_CP_PACKET2); 3195 1.1 riastrad if (r) 3196 1.1 riastrad return r; 3197 1.1 riastrad 3198 1.1 riastrad r = r600_cp_load_microcode(rdev); 3199 1.1 riastrad if (r) 3200 1.1 riastrad return r; 3201 1.1 riastrad r = r600_cp_resume(rdev); 3202 1.1 riastrad if (r) 3203 1.1 riastrad return r; 3204 1.1 riastrad 3205 1.6 riastrad r600_uvd_resume(rdev); 3206 1.1 riastrad 3207 1.1 riastrad r = radeon_ib_pool_init(rdev); 3208 1.1 riastrad if (r) { 3209 1.1 riastrad dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 3210 1.1 riastrad return r; 3211 1.1 riastrad } 3212 1.1 riastrad 3213 1.1 riastrad r = radeon_audio_init(rdev); 3214 1.1 riastrad if (r) { 3215 1.1 riastrad DRM_ERROR("radeon: audio init failed\n"); 3216 1.1 riastrad return r; 3217 1.1 riastrad } 3218 1.1 riastrad 3219 1.1 riastrad return 0; 3220 1.1 riastrad } 3221 1.1 riastrad 3222 1.1 riastrad void r600_vga_set_state(struct radeon_device *rdev, bool state) 3223 1.1 riastrad { 3224 1.1 riastrad uint32_t temp; 3225 1.1 riastrad 3226 1.1 riastrad temp = RREG32(CONFIG_CNTL); 3227 1.6 riastrad if (!state) { 3228 1.1 riastrad temp &= ~(1<<0); 3229 1.1 riastrad temp |= (1<<1); 3230 1.1 riastrad } else { 3231 1.1 riastrad temp &= ~(1<<1); 3232 1.1 riastrad } 3233 1.1 riastrad WREG32(CONFIG_CNTL, temp); 3234 1.1 riastrad } 3235 1.1 riastrad 3236 1.1 riastrad int r600_resume(struct radeon_device *rdev) 3237 1.1 riastrad { 3238 1.1 riastrad int r; 3239 1.1 riastrad 3240 1.1 riastrad /* Do not reset GPU before posting, on r600 hw unlike on r500 hw, 3241 1.1 riastrad * posting will perform necessary task to bring back GPU into good 3242 1.1 riastrad * shape. 3243 1.1 riastrad */ 3244 1.1 riastrad /* post card */ 3245 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 3246 1.1 riastrad 3247 1.1 riastrad if (rdev->pm.pm_method == PM_METHOD_DPM) 3248 1.1 riastrad radeon_pm_resume(rdev); 3249 1.1 riastrad 3250 1.1 riastrad rdev->accel_working = true; 3251 1.1 riastrad r = r600_startup(rdev); 3252 1.1 riastrad if (r) { 3253 1.1 riastrad DRM_ERROR("r600 startup failed on resume\n"); 3254 1.1 riastrad rdev->accel_working = false; 3255 1.1 riastrad return r; 3256 1.1 riastrad } 3257 1.1 riastrad 3258 1.1 riastrad return r; 3259 1.1 riastrad } 3260 1.1 riastrad 3261 1.1 riastrad int r600_suspend(struct radeon_device *rdev) 3262 1.1 riastrad { 3263 1.1 riastrad radeon_pm_suspend(rdev); 3264 1.1 riastrad radeon_audio_fini(rdev); 3265 1.1 riastrad r600_cp_stop(rdev); 3266 1.1 riastrad if (rdev->has_uvd) { 3267 1.1 riastrad uvd_v1_0_fini(rdev); 3268 1.1 riastrad radeon_uvd_suspend(rdev); 3269 1.1 riastrad } 3270 1.1 riastrad r600_irq_suspend(rdev); 3271 1.1 riastrad radeon_wb_disable(rdev); 3272 1.1 riastrad r600_pcie_gart_disable(rdev); 3273 1.1 riastrad 3274 1.1 riastrad return 0; 3275 1.1 riastrad } 3276 1.1 riastrad 3277 1.1 riastrad /* Plan is to move initialization in that function and use 3278 1.1 riastrad * helper function so that radeon_device_init pretty much 3279 1.1 riastrad * do nothing more than calling asic specific function. This 3280 1.1 riastrad * should also allow to remove a bunch of callback function 3281 1.1 riastrad * like vram_info. 3282 1.1 riastrad */ 3283 1.1 riastrad int r600_init(struct radeon_device *rdev) 3284 1.1 riastrad { 3285 1.1 riastrad int r; 3286 1.1 riastrad 3287 1.1 riastrad if (r600_debugfs_mc_info_init(rdev)) { 3288 1.1 riastrad DRM_ERROR("Failed to register debugfs file for mc !\n"); 3289 1.1 riastrad } 3290 1.1 riastrad /* Read BIOS */ 3291 1.1 riastrad if (!radeon_get_bios(rdev)) { 3292 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 3293 1.1 riastrad return -EINVAL; 3294 1.1 riastrad } 3295 1.1 riastrad /* Must be an ATOMBIOS */ 3296 1.1 riastrad if (!rdev->is_atom_bios) { 3297 1.1 riastrad dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); 3298 1.1 riastrad return -EINVAL; 3299 1.1 riastrad } 3300 1.1 riastrad r = radeon_atombios_init(rdev); 3301 1.1 riastrad if (r) 3302 1.1 riastrad return r; 3303 1.1 riastrad /* Post card if necessary */ 3304 1.1 riastrad if (!radeon_card_posted(rdev)) { 3305 1.1 riastrad if (!rdev->bios) { 3306 1.1 riastrad dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 3307 1.1 riastrad return -EINVAL; 3308 1.1 riastrad } 3309 1.1 riastrad DRM_INFO("GPU not posted. posting now...\n"); 3310 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 3311 1.1 riastrad } 3312 1.1 riastrad /* Initialize scratch registers */ 3313 1.1 riastrad r600_scratch_init(rdev); 3314 1.1 riastrad /* Initialize surface registers */ 3315 1.1 riastrad radeon_surface_init(rdev); 3316 1.1 riastrad /* Initialize clocks */ 3317 1.1 riastrad radeon_get_clock_info(rdev->ddev); 3318 1.1 riastrad /* Fence driver */ 3319 1.1 riastrad r = radeon_fence_driver_init(rdev); 3320 1.1 riastrad if (r) 3321 1.1 riastrad return r; 3322 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 3323 1.1 riastrad r = radeon_agp_init(rdev); 3324 1.1 riastrad if (r) 3325 1.1 riastrad radeon_agp_disable(rdev); 3326 1.1 riastrad } 3327 1.1 riastrad r = r600_mc_init(rdev); 3328 1.1 riastrad if (r) 3329 1.1 riastrad return r; 3330 1.1 riastrad /* Memory manager */ 3331 1.1 riastrad r = radeon_bo_init(rdev); 3332 1.1 riastrad if (r) 3333 1.1 riastrad return r; 3334 1.1 riastrad 3335 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 3336 1.1 riastrad r = r600_init_microcode(rdev); 3337 1.1 riastrad if (r) { 3338 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 3339 1.1 riastrad return r; 3340 1.1 riastrad } 3341 1.1 riastrad } 3342 1.1 riastrad 3343 1.1 riastrad /* Initialize power management */ 3344 1.1 riastrad radeon_pm_init(rdev); 3345 1.1 riastrad 3346 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 3347 1.1 riastrad r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 3348 1.1 riastrad 3349 1.6 riastrad r600_uvd_init(rdev); 3350 1.1 riastrad 3351 1.1 riastrad rdev->ih.ring_obj = NULL; 3352 1.1 riastrad r600_ih_ring_init(rdev, 64 * 1024); 3353 1.1 riastrad 3354 1.1 riastrad r = r600_pcie_gart_init(rdev); 3355 1.1 riastrad if (r) 3356 1.1 riastrad return r; 3357 1.1 riastrad 3358 1.1 riastrad rdev->accel_working = true; 3359 1.1 riastrad r = r600_startup(rdev); 3360 1.1 riastrad if (r) { 3361 1.1 riastrad dev_err(rdev->dev, "disabling GPU acceleration\n"); 3362 1.1 riastrad r600_cp_fini(rdev); 3363 1.1 riastrad r600_irq_fini(rdev); 3364 1.1 riastrad radeon_wb_fini(rdev); 3365 1.1 riastrad radeon_ib_pool_fini(rdev); 3366 1.1 riastrad radeon_irq_kms_fini(rdev); 3367 1.1 riastrad r600_pcie_gart_fini(rdev); 3368 1.1 riastrad rdev->accel_working = false; 3369 1.1 riastrad } 3370 1.1 riastrad 3371 1.1 riastrad return 0; 3372 1.1 riastrad } 3373 1.1 riastrad 3374 1.1 riastrad void r600_fini(struct radeon_device *rdev) 3375 1.1 riastrad { 3376 1.1 riastrad radeon_pm_fini(rdev); 3377 1.1 riastrad radeon_audio_fini(rdev); 3378 1.1 riastrad r600_cp_fini(rdev); 3379 1.1 riastrad r600_irq_fini(rdev); 3380 1.1 riastrad if (rdev->has_uvd) { 3381 1.1 riastrad uvd_v1_0_fini(rdev); 3382 1.1 riastrad radeon_uvd_fini(rdev); 3383 1.1 riastrad } 3384 1.1 riastrad radeon_wb_fini(rdev); 3385 1.1 riastrad radeon_ib_pool_fini(rdev); 3386 1.1 riastrad radeon_irq_kms_fini(rdev); 3387 1.1 riastrad r600_pcie_gart_fini(rdev); 3388 1.1 riastrad r600_vram_scratch_fini(rdev); 3389 1.1 riastrad radeon_agp_fini(rdev); 3390 1.1 riastrad radeon_gem_fini(rdev); 3391 1.1 riastrad radeon_fence_driver_fini(rdev); 3392 1.1 riastrad radeon_bo_fini(rdev); 3393 1.1 riastrad radeon_atombios_fini(rdev); 3394 1.1 riastrad kfree(rdev->bios); 3395 1.1 riastrad rdev->bios = NULL; 3396 1.1 riastrad } 3397 1.1 riastrad 3398 1.1 riastrad 3399 1.1 riastrad /* 3400 1.1 riastrad * CS stuff 3401 1.1 riastrad */ 3402 1.1 riastrad void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 3403 1.1 riastrad { 3404 1.1 riastrad struct radeon_ring *ring = &rdev->ring[ib->ring]; 3405 1.1 riastrad u32 next_rptr; 3406 1.1 riastrad 3407 1.1 riastrad if (ring->rptr_save_reg) { 3408 1.1 riastrad next_rptr = ring->wptr + 3 + 4; 3409 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 3410 1.1 riastrad radeon_ring_write(ring, ((ring->rptr_save_reg - 3411 1.1 riastrad PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 3412 1.1 riastrad radeon_ring_write(ring, next_rptr); 3413 1.1 riastrad } else if (rdev->wb.enabled) { 3414 1.1 riastrad next_rptr = ring->wptr + 5 + 4; 3415 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3)); 3416 1.1 riastrad radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 3417 1.1 riastrad radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18)); 3418 1.1 riastrad radeon_ring_write(ring, next_rptr); 3419 1.1 riastrad radeon_ring_write(ring, 0); 3420 1.1 riastrad } 3421 1.1 riastrad 3422 1.1 riastrad radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 3423 1.1 riastrad radeon_ring_write(ring, 3424 1.1 riastrad #ifdef __BIG_ENDIAN 3425 1.1 riastrad (2 << 0) | 3426 1.1 riastrad #endif 3427 1.1 riastrad (ib->gpu_addr & 0xFFFFFFFC)); 3428 1.1 riastrad radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF); 3429 1.1 riastrad radeon_ring_write(ring, ib->length_dw); 3430 1.1 riastrad } 3431 1.1 riastrad 3432 1.1 riastrad int r600_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) 3433 1.1 riastrad { 3434 1.1 riastrad struct radeon_ib ib; 3435 1.1 riastrad uint32_t scratch; 3436 1.1 riastrad uint32_t tmp = 0; 3437 1.1 riastrad unsigned i; 3438 1.1 riastrad int r; 3439 1.1 riastrad 3440 1.1 riastrad r = radeon_scratch_get(rdev, &scratch); 3441 1.1 riastrad if (r) { 3442 1.1 riastrad DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r); 3443 1.1 riastrad return r; 3444 1.1 riastrad } 3445 1.1 riastrad WREG32(scratch, 0xCAFEDEAD); 3446 1.1 riastrad r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); 3447 1.1 riastrad if (r) { 3448 1.1 riastrad DRM_ERROR("radeon: failed to get ib (%d).\n", r); 3449 1.1 riastrad goto free_scratch; 3450 1.1 riastrad } 3451 1.1 riastrad ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); 3452 1.1 riastrad ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); 3453 1.1 riastrad ib.ptr[2] = 0xDEADBEEF; 3454 1.1 riastrad ib.length_dw = 3; 3455 1.1 riastrad r = radeon_ib_schedule(rdev, &ib, NULL, false); 3456 1.1 riastrad if (r) { 3457 1.1 riastrad DRM_ERROR("radeon: failed to schedule ib (%d).\n", r); 3458 1.1 riastrad goto free_ib; 3459 1.1 riastrad } 3460 1.6 riastrad r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies( 3461 1.6 riastrad RADEON_USEC_IB_TEST_TIMEOUT)); 3462 1.6 riastrad if (r < 0) { 3463 1.1 riastrad DRM_ERROR("radeon: fence wait failed (%d).\n", r); 3464 1.1 riastrad goto free_ib; 3465 1.6 riastrad } else if (r == 0) { 3466 1.6 riastrad DRM_ERROR("radeon: fence wait timed out.\n"); 3467 1.6 riastrad r = -ETIMEDOUT; 3468 1.6 riastrad goto free_ib; 3469 1.1 riastrad } 3470 1.6 riastrad r = 0; 3471 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 3472 1.1 riastrad tmp = RREG32(scratch); 3473 1.1 riastrad if (tmp == 0xDEADBEEF) 3474 1.1 riastrad break; 3475 1.6 riastrad udelay(1); 3476 1.1 riastrad } 3477 1.1 riastrad if (i < rdev->usec_timeout) { 3478 1.1 riastrad DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i); 3479 1.1 riastrad } else { 3480 1.1 riastrad DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n", 3481 1.1 riastrad scratch, tmp); 3482 1.1 riastrad r = -EINVAL; 3483 1.1 riastrad } 3484 1.1 riastrad free_ib: 3485 1.1 riastrad radeon_ib_free(rdev, &ib); 3486 1.1 riastrad free_scratch: 3487 1.1 riastrad radeon_scratch_free(rdev, scratch); 3488 1.1 riastrad return r; 3489 1.1 riastrad } 3490 1.1 riastrad 3491 1.1 riastrad /* 3492 1.1 riastrad * Interrupts 3493 1.1 riastrad * 3494 1.1 riastrad * Interrupts use a ring buffer on r6xx/r7xx hardware. It works pretty 3495 1.1 riastrad * the same as the CP ring buffer, but in reverse. Rather than the CPU 3496 1.1 riastrad * writing to the ring and the GPU consuming, the GPU writes to the ring 3497 1.1 riastrad * and host consumes. As the host irq handler processes interrupts, it 3498 1.1 riastrad * increments the rptr. When the rptr catches up with the wptr, all the 3499 1.1 riastrad * current interrupts have been processed. 3500 1.1 riastrad */ 3501 1.1 riastrad 3502 1.1 riastrad void r600_ih_ring_init(struct radeon_device *rdev, unsigned ring_size) 3503 1.1 riastrad { 3504 1.1 riastrad u32 rb_bufsz; 3505 1.1 riastrad 3506 1.1 riastrad /* Align ring size */ 3507 1.1 riastrad rb_bufsz = order_base_2(ring_size / 4); 3508 1.1 riastrad ring_size = (1 << rb_bufsz) * 4; 3509 1.1 riastrad rdev->ih.ring_size = ring_size; 3510 1.1 riastrad rdev->ih.ptr_mask = rdev->ih.ring_size - 1; 3511 1.1 riastrad rdev->ih.rptr = 0; 3512 1.1 riastrad } 3513 1.1 riastrad 3514 1.1 riastrad int r600_ih_ring_alloc(struct radeon_device *rdev) 3515 1.1 riastrad { 3516 1.1 riastrad int r; 3517 1.1 riastrad 3518 1.1 riastrad /* Allocate ring buffer */ 3519 1.1 riastrad if (rdev->ih.ring_obj == NULL) { 3520 1.1 riastrad r = radeon_bo_create(rdev, rdev->ih.ring_size, 3521 1.1 riastrad PAGE_SIZE, true, 3522 1.1 riastrad RADEON_GEM_DOMAIN_GTT, 0, 3523 1.1 riastrad NULL, NULL, &rdev->ih.ring_obj); 3524 1.1 riastrad if (r) { 3525 1.1 riastrad DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r); 3526 1.1 riastrad return r; 3527 1.1 riastrad } 3528 1.1 riastrad r = radeon_bo_reserve(rdev->ih.ring_obj, false); 3529 1.1 riastrad if (unlikely(r != 0)) 3530 1.1 riastrad return r; 3531 1.1 riastrad r = radeon_bo_pin(rdev->ih.ring_obj, 3532 1.1 riastrad RADEON_GEM_DOMAIN_GTT, 3533 1.1 riastrad &rdev->ih.gpu_addr); 3534 1.1 riastrad if (r) { 3535 1.1 riastrad radeon_bo_unreserve(rdev->ih.ring_obj); 3536 1.1 riastrad DRM_ERROR("radeon: failed to pin ih ring buffer (%d).\n", r); 3537 1.1 riastrad return r; 3538 1.1 riastrad } 3539 1.1 riastrad r = radeon_bo_kmap(rdev->ih.ring_obj, 3540 1.1 riastrad (void **)__UNVOLATILE(&rdev->ih.ring)); 3541 1.1 riastrad radeon_bo_unreserve(rdev->ih.ring_obj); 3542 1.1 riastrad if (r) { 3543 1.1 riastrad DRM_ERROR("radeon: failed to map ih ring buffer (%d).\n", r); 3544 1.1 riastrad return r; 3545 1.1 riastrad } 3546 1.1 riastrad } 3547 1.1 riastrad return 0; 3548 1.1 riastrad } 3549 1.1 riastrad 3550 1.1 riastrad void r600_ih_ring_fini(struct radeon_device *rdev) 3551 1.1 riastrad { 3552 1.1 riastrad int r; 3553 1.1 riastrad if (rdev->ih.ring_obj) { 3554 1.1 riastrad r = radeon_bo_reserve(rdev->ih.ring_obj, false); 3555 1.1 riastrad if (likely(r == 0)) { 3556 1.1 riastrad radeon_bo_kunmap(rdev->ih.ring_obj); 3557 1.1 riastrad radeon_bo_unpin(rdev->ih.ring_obj); 3558 1.1 riastrad radeon_bo_unreserve(rdev->ih.ring_obj); 3559 1.1 riastrad } 3560 1.1 riastrad radeon_bo_unref(&rdev->ih.ring_obj); 3561 1.1 riastrad rdev->ih.ring = NULL; 3562 1.1 riastrad rdev->ih.ring_obj = NULL; 3563 1.1 riastrad } 3564 1.1 riastrad } 3565 1.1 riastrad 3566 1.1 riastrad void r600_rlc_stop(struct radeon_device *rdev) 3567 1.1 riastrad { 3568 1.1 riastrad 3569 1.1 riastrad if ((rdev->family >= CHIP_RV770) && 3570 1.1 riastrad (rdev->family <= CHIP_RV740)) { 3571 1.1 riastrad /* r7xx asics need to soft reset RLC before halting */ 3572 1.1 riastrad WREG32(SRBM_SOFT_RESET, SOFT_RESET_RLC); 3573 1.1 riastrad RREG32(SRBM_SOFT_RESET); 3574 1.1 riastrad mdelay(15); 3575 1.1 riastrad WREG32(SRBM_SOFT_RESET, 0); 3576 1.1 riastrad RREG32(SRBM_SOFT_RESET); 3577 1.1 riastrad } 3578 1.1 riastrad 3579 1.1 riastrad WREG32(RLC_CNTL, 0); 3580 1.1 riastrad } 3581 1.1 riastrad 3582 1.1 riastrad static void r600_rlc_start(struct radeon_device *rdev) 3583 1.1 riastrad { 3584 1.1 riastrad WREG32(RLC_CNTL, RLC_ENABLE); 3585 1.1 riastrad } 3586 1.1 riastrad 3587 1.1 riastrad static int r600_rlc_resume(struct radeon_device *rdev) 3588 1.1 riastrad { 3589 1.1 riastrad u32 i; 3590 1.1 riastrad const __be32 *fw_data; 3591 1.1 riastrad 3592 1.1 riastrad if (!rdev->rlc_fw) 3593 1.1 riastrad return -EINVAL; 3594 1.1 riastrad 3595 1.1 riastrad r600_rlc_stop(rdev); 3596 1.1 riastrad 3597 1.1 riastrad WREG32(RLC_HB_CNTL, 0); 3598 1.1 riastrad 3599 1.1 riastrad WREG32(RLC_HB_BASE, 0); 3600 1.1 riastrad WREG32(RLC_HB_RPTR, 0); 3601 1.1 riastrad WREG32(RLC_HB_WPTR, 0); 3602 1.1 riastrad WREG32(RLC_HB_WPTR_LSB_ADDR, 0); 3603 1.1 riastrad WREG32(RLC_HB_WPTR_MSB_ADDR, 0); 3604 1.1 riastrad WREG32(RLC_MC_CNTL, 0); 3605 1.1 riastrad WREG32(RLC_UCODE_CNTL, 0); 3606 1.1 riastrad 3607 1.1 riastrad fw_data = (const __be32 *)rdev->rlc_fw->data; 3608 1.1 riastrad if (rdev->family >= CHIP_RV770) { 3609 1.1 riastrad for (i = 0; i < R700_RLC_UCODE_SIZE; i++) { 3610 1.1 riastrad WREG32(RLC_UCODE_ADDR, i); 3611 1.1 riastrad WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 3612 1.1 riastrad } 3613 1.1 riastrad } else { 3614 1.1 riastrad for (i = 0; i < R600_RLC_UCODE_SIZE; i++) { 3615 1.1 riastrad WREG32(RLC_UCODE_ADDR, i); 3616 1.1 riastrad WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 3617 1.1 riastrad } 3618 1.1 riastrad } 3619 1.1 riastrad WREG32(RLC_UCODE_ADDR, 0); 3620 1.1 riastrad 3621 1.1 riastrad r600_rlc_start(rdev); 3622 1.1 riastrad 3623 1.1 riastrad return 0; 3624 1.1 riastrad } 3625 1.1 riastrad 3626 1.1 riastrad static void r600_enable_interrupts(struct radeon_device *rdev) 3627 1.1 riastrad { 3628 1.1 riastrad u32 ih_cntl = RREG32(IH_CNTL); 3629 1.1 riastrad u32 ih_rb_cntl = RREG32(IH_RB_CNTL); 3630 1.1 riastrad 3631 1.1 riastrad ih_cntl |= ENABLE_INTR; 3632 1.1 riastrad ih_rb_cntl |= IH_RB_ENABLE; 3633 1.1 riastrad WREG32(IH_CNTL, ih_cntl); 3634 1.1 riastrad WREG32(IH_RB_CNTL, ih_rb_cntl); 3635 1.1 riastrad rdev->ih.enabled = true; 3636 1.1 riastrad } 3637 1.1 riastrad 3638 1.1 riastrad void r600_disable_interrupts(struct radeon_device *rdev) 3639 1.1 riastrad { 3640 1.1 riastrad u32 ih_rb_cntl = RREG32(IH_RB_CNTL); 3641 1.1 riastrad u32 ih_cntl = RREG32(IH_CNTL); 3642 1.1 riastrad 3643 1.1 riastrad ih_rb_cntl &= ~IH_RB_ENABLE; 3644 1.1 riastrad ih_cntl &= ~ENABLE_INTR; 3645 1.1 riastrad WREG32(IH_RB_CNTL, ih_rb_cntl); 3646 1.1 riastrad WREG32(IH_CNTL, ih_cntl); 3647 1.1 riastrad /* set rptr, wptr to 0 */ 3648 1.1 riastrad WREG32(IH_RB_RPTR, 0); 3649 1.1 riastrad WREG32(IH_RB_WPTR, 0); 3650 1.1 riastrad rdev->ih.enabled = false; 3651 1.1 riastrad rdev->ih.rptr = 0; 3652 1.1 riastrad } 3653 1.1 riastrad 3654 1.1 riastrad static void r600_disable_interrupt_state(struct radeon_device *rdev) 3655 1.1 riastrad { 3656 1.1 riastrad u32 tmp; 3657 1.1 riastrad 3658 1.1 riastrad WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 3659 1.1 riastrad tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE; 3660 1.1 riastrad WREG32(DMA_CNTL, tmp); 3661 1.1 riastrad WREG32(GRBM_INT_CNTL, 0); 3662 1.1 riastrad WREG32(DxMODE_INT_MASK, 0); 3663 1.1 riastrad WREG32(D1GRPH_INTERRUPT_CONTROL, 0); 3664 1.1 riastrad WREG32(D2GRPH_INTERRUPT_CONTROL, 0); 3665 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3666 1.1 riastrad WREG32(DCE3_DACA_AUTODETECT_INT_CONTROL, 0); 3667 1.1 riastrad WREG32(DCE3_DACB_AUTODETECT_INT_CONTROL, 0); 3668 1.1 riastrad tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3669 1.1 riastrad WREG32(DC_HPD1_INT_CONTROL, tmp); 3670 1.1 riastrad tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3671 1.1 riastrad WREG32(DC_HPD2_INT_CONTROL, tmp); 3672 1.1 riastrad tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3673 1.1 riastrad WREG32(DC_HPD3_INT_CONTROL, tmp); 3674 1.1 riastrad tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3675 1.1 riastrad WREG32(DC_HPD4_INT_CONTROL, tmp); 3676 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 3677 1.1 riastrad tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3678 1.1 riastrad WREG32(DC_HPD5_INT_CONTROL, tmp); 3679 1.1 riastrad tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY; 3680 1.1 riastrad WREG32(DC_HPD6_INT_CONTROL, tmp); 3681 1.1 riastrad tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3682 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp); 3683 1.1 riastrad tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3684 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp); 3685 1.1 riastrad } else { 3686 1.1 riastrad tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3687 1.1 riastrad WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp); 3688 1.1 riastrad tmp = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3689 1.1 riastrad WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, tmp); 3690 1.1 riastrad } 3691 1.1 riastrad } else { 3692 1.1 riastrad WREG32(DACA_AUTODETECT_INT_CONTROL, 0); 3693 1.1 riastrad WREG32(DACB_AUTODETECT_INT_CONTROL, 0); 3694 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY; 3695 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp); 3696 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY; 3697 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp); 3698 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY; 3699 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp); 3700 1.1 riastrad tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3701 1.1 riastrad WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp); 3702 1.1 riastrad tmp = RREG32(HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3703 1.1 riastrad WREG32(HDMI1_AUDIO_PACKET_CONTROL, tmp); 3704 1.1 riastrad } 3705 1.1 riastrad } 3706 1.1 riastrad 3707 1.1 riastrad int r600_irq_init(struct radeon_device *rdev) 3708 1.1 riastrad { 3709 1.1 riastrad int ret = 0; 3710 1.1 riastrad int rb_bufsz; 3711 1.1 riastrad u32 interrupt_cntl, ih_cntl, ih_rb_cntl; 3712 1.1 riastrad 3713 1.1 riastrad /* allocate ring */ 3714 1.1 riastrad ret = r600_ih_ring_alloc(rdev); 3715 1.1 riastrad if (ret) 3716 1.1 riastrad return ret; 3717 1.1 riastrad 3718 1.1 riastrad /* disable irqs */ 3719 1.1 riastrad r600_disable_interrupts(rdev); 3720 1.1 riastrad 3721 1.1 riastrad /* init rlc */ 3722 1.1 riastrad if (rdev->family >= CHIP_CEDAR) 3723 1.1 riastrad ret = evergreen_rlc_resume(rdev); 3724 1.1 riastrad else 3725 1.1 riastrad ret = r600_rlc_resume(rdev); 3726 1.1 riastrad if (ret) { 3727 1.1 riastrad r600_ih_ring_fini(rdev); 3728 1.1 riastrad return ret; 3729 1.1 riastrad } 3730 1.1 riastrad 3731 1.1 riastrad /* setup interrupt control */ 3732 1.6 riastrad /* set dummy read address to dummy page address */ 3733 1.6 riastrad WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); 3734 1.1 riastrad interrupt_cntl = RREG32(INTERRUPT_CNTL); 3735 1.1 riastrad /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi 3736 1.1 riastrad * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN 3737 1.1 riastrad */ 3738 1.1 riastrad interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE; 3739 1.1 riastrad /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */ 3740 1.1 riastrad interrupt_cntl &= ~IH_REQ_NONSNOOP_EN; 3741 1.1 riastrad WREG32(INTERRUPT_CNTL, interrupt_cntl); 3742 1.1 riastrad 3743 1.1 riastrad WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8); 3744 1.1 riastrad rb_bufsz = order_base_2(rdev->ih.ring_size / 4); 3745 1.1 riastrad 3746 1.1 riastrad ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE | 3747 1.1 riastrad IH_WPTR_OVERFLOW_CLEAR | 3748 1.1 riastrad (rb_bufsz << 1)); 3749 1.1 riastrad 3750 1.1 riastrad if (rdev->wb.enabled) 3751 1.1 riastrad ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE; 3752 1.1 riastrad 3753 1.1 riastrad /* set the writeback address whether it's enabled or not */ 3754 1.1 riastrad WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC); 3755 1.1 riastrad WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF); 3756 1.1 riastrad 3757 1.1 riastrad WREG32(IH_RB_CNTL, ih_rb_cntl); 3758 1.1 riastrad 3759 1.1 riastrad /* set rptr, wptr to 0 */ 3760 1.1 riastrad WREG32(IH_RB_RPTR, 0); 3761 1.1 riastrad WREG32(IH_RB_WPTR, 0); 3762 1.1 riastrad 3763 1.1 riastrad /* Default settings for IH_CNTL (disabled at first) */ 3764 1.1 riastrad ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10); 3765 1.1 riastrad /* RPTR_REARM only works if msi's are enabled */ 3766 1.1 riastrad if (rdev->msi_enabled) 3767 1.1 riastrad ih_cntl |= RPTR_REARM; 3768 1.1 riastrad WREG32(IH_CNTL, ih_cntl); 3769 1.1 riastrad 3770 1.1 riastrad /* force the active interrupt state to all disabled */ 3771 1.1 riastrad if (rdev->family >= CHIP_CEDAR) 3772 1.1 riastrad evergreen_disable_interrupt_state(rdev); 3773 1.1 riastrad else 3774 1.1 riastrad r600_disable_interrupt_state(rdev); 3775 1.1 riastrad 3776 1.1 riastrad /* at this point everything should be setup correctly to enable master */ 3777 1.1 riastrad pci_set_master(rdev->pdev); 3778 1.1 riastrad 3779 1.1 riastrad /* enable irqs */ 3780 1.1 riastrad r600_enable_interrupts(rdev); 3781 1.1 riastrad 3782 1.1 riastrad return ret; 3783 1.1 riastrad } 3784 1.1 riastrad 3785 1.1 riastrad void r600_irq_suspend(struct radeon_device *rdev) 3786 1.1 riastrad { 3787 1.1 riastrad r600_irq_disable(rdev); 3788 1.1 riastrad r600_rlc_stop(rdev); 3789 1.1 riastrad } 3790 1.1 riastrad 3791 1.1 riastrad void r600_irq_fini(struct radeon_device *rdev) 3792 1.1 riastrad { 3793 1.1 riastrad r600_irq_suspend(rdev); 3794 1.1 riastrad r600_ih_ring_fini(rdev); 3795 1.1 riastrad } 3796 1.1 riastrad 3797 1.1 riastrad int r600_irq_set(struct radeon_device *rdev) 3798 1.1 riastrad { 3799 1.1 riastrad u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; 3800 1.1 riastrad u32 mode_int = 0; 3801 1.1 riastrad u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; 3802 1.1 riastrad u32 grbm_int_cntl = 0; 3803 1.1 riastrad u32 hdmi0, hdmi1; 3804 1.1 riastrad u32 dma_cntl; 3805 1.1 riastrad u32 thermal_int = 0; 3806 1.1 riastrad 3807 1.1 riastrad if (!rdev->irq.installed) { 3808 1.1 riastrad WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); 3809 1.1 riastrad return -EINVAL; 3810 1.1 riastrad } 3811 1.1 riastrad /* don't enable anything if the ih is disabled */ 3812 1.1 riastrad if (!rdev->ih.enabled) { 3813 1.1 riastrad r600_disable_interrupts(rdev); 3814 1.1 riastrad /* force the active interrupt state to all disabled */ 3815 1.1 riastrad r600_disable_interrupt_state(rdev); 3816 1.1 riastrad return 0; 3817 1.1 riastrad } 3818 1.1 riastrad 3819 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3820 1.1 riastrad hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; 3821 1.1 riastrad hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; 3822 1.1 riastrad hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; 3823 1.1 riastrad hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN; 3824 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 3825 1.1 riastrad hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; 3826 1.1 riastrad hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; 3827 1.1 riastrad hdmi0 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~AFMT_AZ_FORMAT_WTRIG_MASK; 3828 1.1 riastrad hdmi1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~AFMT_AZ_FORMAT_WTRIG_MASK; 3829 1.1 riastrad } else { 3830 1.1 riastrad hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3831 1.1 riastrad hdmi1 = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3832 1.1 riastrad } 3833 1.1 riastrad } else { 3834 1.1 riastrad hpd1 = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL) & ~DC_HPDx_INT_EN; 3835 1.1 riastrad hpd2 = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL) & ~DC_HPDx_INT_EN; 3836 1.1 riastrad hpd3 = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & ~DC_HPDx_INT_EN; 3837 1.1 riastrad hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3838 1.1 riastrad hdmi1 = RREG32(HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; 3839 1.1 riastrad } 3840 1.1 riastrad 3841 1.1 riastrad dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE; 3842 1.1 riastrad 3843 1.1 riastrad if ((rdev->family > CHIP_R600) && (rdev->family < CHIP_RV770)) { 3844 1.1 riastrad thermal_int = RREG32(CG_THERMAL_INT) & 3845 1.1 riastrad ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 3846 1.1 riastrad } else if (rdev->family >= CHIP_RV770) { 3847 1.1 riastrad thermal_int = RREG32(RV770_CG_THERMAL_INT) & 3848 1.1 riastrad ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 3849 1.1 riastrad } 3850 1.1 riastrad if (rdev->irq.dpm_thermal) { 3851 1.1 riastrad DRM_DEBUG("dpm thermal\n"); 3852 1.1 riastrad thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; 3853 1.1 riastrad } 3854 1.1 riastrad 3855 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) { 3856 1.1 riastrad DRM_DEBUG("r600_irq_set: sw int\n"); 3857 1.1 riastrad cp_int_cntl |= RB_INT_ENABLE; 3858 1.1 riastrad cp_int_cntl |= TIME_STAMP_INT_ENABLE; 3859 1.1 riastrad } 3860 1.1 riastrad 3861 1.1 riastrad if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) { 3862 1.1 riastrad DRM_DEBUG("r600_irq_set: sw int dma\n"); 3863 1.1 riastrad dma_cntl |= TRAP_ENABLE; 3864 1.1 riastrad } 3865 1.1 riastrad 3866 1.1 riastrad if (rdev->irq.crtc_vblank_int[0] || 3867 1.1 riastrad atomic_read(&rdev->irq.pflip[0])) { 3868 1.1 riastrad DRM_DEBUG("r600_irq_set: vblank 0\n"); 3869 1.1 riastrad mode_int |= D1MODE_VBLANK_INT_MASK; 3870 1.1 riastrad } 3871 1.1 riastrad if (rdev->irq.crtc_vblank_int[1] || 3872 1.1 riastrad atomic_read(&rdev->irq.pflip[1])) { 3873 1.1 riastrad DRM_DEBUG("r600_irq_set: vblank 1\n"); 3874 1.1 riastrad mode_int |= D2MODE_VBLANK_INT_MASK; 3875 1.1 riastrad } 3876 1.1 riastrad if (rdev->irq.hpd[0]) { 3877 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 1\n"); 3878 1.1 riastrad hpd1 |= DC_HPDx_INT_EN; 3879 1.1 riastrad } 3880 1.1 riastrad if (rdev->irq.hpd[1]) { 3881 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 2\n"); 3882 1.1 riastrad hpd2 |= DC_HPDx_INT_EN; 3883 1.1 riastrad } 3884 1.1 riastrad if (rdev->irq.hpd[2]) { 3885 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 3\n"); 3886 1.1 riastrad hpd3 |= DC_HPDx_INT_EN; 3887 1.1 riastrad } 3888 1.1 riastrad if (rdev->irq.hpd[3]) { 3889 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 4\n"); 3890 1.1 riastrad hpd4 |= DC_HPDx_INT_EN; 3891 1.1 riastrad } 3892 1.1 riastrad if (rdev->irq.hpd[4]) { 3893 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 5\n"); 3894 1.1 riastrad hpd5 |= DC_HPDx_INT_EN; 3895 1.1 riastrad } 3896 1.1 riastrad if (rdev->irq.hpd[5]) { 3897 1.1 riastrad DRM_DEBUG("r600_irq_set: hpd 6\n"); 3898 1.1 riastrad hpd6 |= DC_HPDx_INT_EN; 3899 1.1 riastrad } 3900 1.1 riastrad if (rdev->irq.afmt[0]) { 3901 1.1 riastrad DRM_DEBUG("r600_irq_set: hdmi 0\n"); 3902 1.1 riastrad hdmi0 |= HDMI0_AZ_FORMAT_WTRIG_MASK; 3903 1.1 riastrad } 3904 1.1 riastrad if (rdev->irq.afmt[1]) { 3905 1.1 riastrad DRM_DEBUG("r600_irq_set: hdmi 0\n"); 3906 1.1 riastrad hdmi1 |= HDMI0_AZ_FORMAT_WTRIG_MASK; 3907 1.1 riastrad } 3908 1.1 riastrad 3909 1.1 riastrad WREG32(CP_INT_CNTL, cp_int_cntl); 3910 1.1 riastrad WREG32(DMA_CNTL, dma_cntl); 3911 1.1 riastrad WREG32(DxMODE_INT_MASK, mode_int); 3912 1.1 riastrad WREG32(D1GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); 3913 1.1 riastrad WREG32(D2GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); 3914 1.1 riastrad WREG32(GRBM_INT_CNTL, grbm_int_cntl); 3915 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3916 1.1 riastrad WREG32(DC_HPD1_INT_CONTROL, hpd1); 3917 1.1 riastrad WREG32(DC_HPD2_INT_CONTROL, hpd2); 3918 1.1 riastrad WREG32(DC_HPD3_INT_CONTROL, hpd3); 3919 1.1 riastrad WREG32(DC_HPD4_INT_CONTROL, hpd4); 3920 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 3921 1.1 riastrad WREG32(DC_HPD5_INT_CONTROL, hpd5); 3922 1.1 riastrad WREG32(DC_HPD6_INT_CONTROL, hpd6); 3923 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, hdmi0); 3924 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, hdmi1); 3925 1.1 riastrad } else { 3926 1.1 riastrad WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0); 3927 1.1 riastrad WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, hdmi1); 3928 1.1 riastrad } 3929 1.1 riastrad } else { 3930 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, hpd1); 3931 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2); 3932 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, hpd3); 3933 1.1 riastrad WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0); 3934 1.1 riastrad WREG32(HDMI1_AUDIO_PACKET_CONTROL, hdmi1); 3935 1.1 riastrad } 3936 1.1 riastrad if ((rdev->family > CHIP_R600) && (rdev->family < CHIP_RV770)) { 3937 1.1 riastrad WREG32(CG_THERMAL_INT, thermal_int); 3938 1.1 riastrad } else if (rdev->family >= CHIP_RV770) { 3939 1.1 riastrad WREG32(RV770_CG_THERMAL_INT, thermal_int); 3940 1.1 riastrad } 3941 1.1 riastrad 3942 1.1 riastrad /* posting read */ 3943 1.1 riastrad RREG32(R_000E50_SRBM_STATUS); 3944 1.1 riastrad 3945 1.1 riastrad return 0; 3946 1.1 riastrad } 3947 1.1 riastrad 3948 1.1 riastrad static void r600_irq_ack(struct radeon_device *rdev) 3949 1.1 riastrad { 3950 1.1 riastrad u32 tmp; 3951 1.1 riastrad 3952 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3953 1.1 riastrad rdev->irq.stat_regs.r600.disp_int = RREG32(DCE3_DISP_INTERRUPT_STATUS); 3954 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE); 3955 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2); 3956 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 3957 1.1 riastrad rdev->irq.stat_regs.r600.hdmi0_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET0); 3958 1.1 riastrad rdev->irq.stat_regs.r600.hdmi1_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET1); 3959 1.1 riastrad } else { 3960 1.1 riastrad rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS); 3961 1.1 riastrad rdev->irq.stat_regs.r600.hdmi1_status = RREG32(DCE3_HDMI1_STATUS); 3962 1.1 riastrad } 3963 1.1 riastrad } else { 3964 1.1 riastrad rdev->irq.stat_regs.r600.disp_int = RREG32(DISP_INTERRUPT_STATUS); 3965 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE); 3966 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont2 = 0; 3967 1.1 riastrad rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS); 3968 1.1 riastrad rdev->irq.stat_regs.r600.hdmi1_status = RREG32(HDMI1_STATUS); 3969 1.1 riastrad } 3970 1.1 riastrad rdev->irq.stat_regs.r600.d1grph_int = RREG32(D1GRPH_INTERRUPT_STATUS); 3971 1.1 riastrad rdev->irq.stat_regs.r600.d2grph_int = RREG32(D2GRPH_INTERRUPT_STATUS); 3972 1.1 riastrad 3973 1.1 riastrad if (rdev->irq.stat_regs.r600.d1grph_int & DxGRPH_PFLIP_INT_OCCURRED) 3974 1.1 riastrad WREG32(D1GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR); 3975 1.1 riastrad if (rdev->irq.stat_regs.r600.d2grph_int & DxGRPH_PFLIP_INT_OCCURRED) 3976 1.1 riastrad WREG32(D2GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR); 3977 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT) 3978 1.1 riastrad WREG32(D1MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK); 3979 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT) 3980 1.1 riastrad WREG32(D1MODE_VLINE_STATUS, DxMODE_VLINE_ACK); 3981 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT) 3982 1.1 riastrad WREG32(D2MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK); 3983 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT) 3984 1.1 riastrad WREG32(D2MODE_VLINE_STATUS, DxMODE_VLINE_ACK); 3985 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) { 3986 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3987 1.1 riastrad tmp = RREG32(DC_HPD1_INT_CONTROL); 3988 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 3989 1.1 riastrad WREG32(DC_HPD1_INT_CONTROL, tmp); 3990 1.1 riastrad } else { 3991 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL); 3992 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 3993 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp); 3994 1.1 riastrad } 3995 1.1 riastrad } 3996 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) { 3997 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 3998 1.1 riastrad tmp = RREG32(DC_HPD2_INT_CONTROL); 3999 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4000 1.1 riastrad WREG32(DC_HPD2_INT_CONTROL, tmp); 4001 1.1 riastrad } else { 4002 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL); 4003 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4004 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp); 4005 1.1 riastrad } 4006 1.1 riastrad } 4007 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) { 4008 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 4009 1.1 riastrad tmp = RREG32(DC_HPD3_INT_CONTROL); 4010 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4011 1.1 riastrad WREG32(DC_HPD3_INT_CONTROL, tmp); 4012 1.1 riastrad } else { 4013 1.1 riastrad tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL); 4014 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4015 1.1 riastrad WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp); 4016 1.1 riastrad } 4017 1.1 riastrad } 4018 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) { 4019 1.1 riastrad tmp = RREG32(DC_HPD4_INT_CONTROL); 4020 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4021 1.1 riastrad WREG32(DC_HPD4_INT_CONTROL, tmp); 4022 1.1 riastrad } 4023 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 4024 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) { 4025 1.1 riastrad tmp = RREG32(DC_HPD5_INT_CONTROL); 4026 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4027 1.1 riastrad WREG32(DC_HPD5_INT_CONTROL, tmp); 4028 1.1 riastrad } 4029 1.1 riastrad if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { 4030 1.1 riastrad tmp = RREG32(DC_HPD6_INT_CONTROL); 4031 1.1 riastrad tmp |= DC_HPDx_INT_ACK; 4032 1.1 riastrad WREG32(DC_HPD6_INT_CONTROL, tmp); 4033 1.1 riastrad } 4034 1.1 riastrad if (rdev->irq.stat_regs.r600.hdmi0_status & AFMT_AZ_FORMAT_WTRIG) { 4035 1.1 riastrad tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0); 4036 1.1 riastrad tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; 4037 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp); 4038 1.1 riastrad } 4039 1.1 riastrad if (rdev->irq.stat_regs.r600.hdmi1_status & AFMT_AZ_FORMAT_WTRIG) { 4040 1.1 riastrad tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1); 4041 1.1 riastrad tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; 4042 1.1 riastrad WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp); 4043 1.1 riastrad } 4044 1.1 riastrad } else { 4045 1.1 riastrad if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) { 4046 1.1 riastrad tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL); 4047 1.1 riastrad tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK; 4048 1.1 riastrad WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp); 4049 1.1 riastrad } 4050 1.1 riastrad if (rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG) { 4051 1.1 riastrad if (ASIC_IS_DCE3(rdev)) { 4052 1.1 riastrad tmp = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL); 4053 1.1 riastrad tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK; 4054 1.1 riastrad WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, tmp); 4055 1.1 riastrad } else { 4056 1.1 riastrad tmp = RREG32(HDMI1_AUDIO_PACKET_CONTROL); 4057 1.1 riastrad tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK; 4058 1.1 riastrad WREG32(HDMI1_AUDIO_PACKET_CONTROL, tmp); 4059 1.1 riastrad } 4060 1.1 riastrad } 4061 1.1 riastrad } 4062 1.1 riastrad } 4063 1.1 riastrad 4064 1.1 riastrad void r600_irq_disable(struct radeon_device *rdev) 4065 1.1 riastrad { 4066 1.1 riastrad r600_disable_interrupts(rdev); 4067 1.1 riastrad /* Wait and acknowledge irq */ 4068 1.1 riastrad mdelay(1); 4069 1.1 riastrad r600_irq_ack(rdev); 4070 1.1 riastrad r600_disable_interrupt_state(rdev); 4071 1.1 riastrad } 4072 1.1 riastrad 4073 1.1 riastrad static u32 r600_get_ih_wptr(struct radeon_device *rdev) 4074 1.1 riastrad { 4075 1.1 riastrad u32 wptr, tmp; 4076 1.1 riastrad 4077 1.1 riastrad if (rdev->wb.enabled) 4078 1.1 riastrad wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); 4079 1.1 riastrad else 4080 1.1 riastrad wptr = RREG32(IH_RB_WPTR); 4081 1.1 riastrad 4082 1.1 riastrad if (wptr & RB_OVERFLOW) { 4083 1.1 riastrad wptr &= ~RB_OVERFLOW; 4084 1.1 riastrad /* When a ring buffer overflow happen start parsing interrupt 4085 1.1 riastrad * from the last not overwritten vector (wptr + 16). Hopefully 4086 1.1 riastrad * this should allow us to catchup. 4087 1.1 riastrad */ 4088 1.1 riastrad dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n", 4089 1.1 riastrad wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask); 4090 1.1 riastrad rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; 4091 1.1 riastrad tmp = RREG32(IH_RB_CNTL); 4092 1.1 riastrad tmp |= IH_WPTR_OVERFLOW_CLEAR; 4093 1.1 riastrad WREG32(IH_RB_CNTL, tmp); 4094 1.1 riastrad } 4095 1.1 riastrad return (wptr & rdev->ih.ptr_mask); 4096 1.1 riastrad } 4097 1.1 riastrad 4098 1.1 riastrad /* r600 IV Ring 4099 1.1 riastrad * Each IV ring entry is 128 bits: 4100 1.1 riastrad * [7:0] - interrupt source id 4101 1.1 riastrad * [31:8] - reserved 4102 1.1 riastrad * [59:32] - interrupt source data 4103 1.1 riastrad * [127:60] - reserved 4104 1.1 riastrad * 4105 1.1 riastrad * The basic interrupt vector entries 4106 1.1 riastrad * are decoded as follows: 4107 1.1 riastrad * src_id src_data description 4108 1.1 riastrad * 1 0 D1 Vblank 4109 1.1 riastrad * 1 1 D1 Vline 4110 1.1 riastrad * 5 0 D2 Vblank 4111 1.1 riastrad * 5 1 D2 Vline 4112 1.1 riastrad * 19 0 FP Hot plug detection A 4113 1.1 riastrad * 19 1 FP Hot plug detection B 4114 1.1 riastrad * 19 2 DAC A auto-detection 4115 1.1 riastrad * 19 3 DAC B auto-detection 4116 1.1 riastrad * 21 4 HDMI block A 4117 1.1 riastrad * 21 5 HDMI block B 4118 1.1 riastrad * 176 - CP_INT RB 4119 1.1 riastrad * 177 - CP_INT IB1 4120 1.1 riastrad * 178 - CP_INT IB2 4121 1.1 riastrad * 181 - EOP Interrupt 4122 1.1 riastrad * 233 - GUI Idle 4123 1.1 riastrad * 4124 1.1 riastrad * Note, these are based on r600 and may need to be 4125 1.1 riastrad * adjusted or added to on newer asics 4126 1.1 riastrad */ 4127 1.1 riastrad 4128 1.1 riastrad int r600_irq_process(struct radeon_device *rdev) 4129 1.1 riastrad { 4130 1.1 riastrad u32 wptr; 4131 1.1 riastrad u32 rptr; 4132 1.1 riastrad u32 src_id, src_data; 4133 1.1 riastrad u32 ring_index; 4134 1.1 riastrad bool queue_hotplug = false; 4135 1.1 riastrad bool queue_hdmi = false; 4136 1.1 riastrad bool queue_thermal = false; 4137 1.1 riastrad 4138 1.1 riastrad if (!rdev->ih.enabled || rdev->shutdown) 4139 1.1 riastrad return IRQ_NONE; 4140 1.1 riastrad 4141 1.1 riastrad /* No MSIs, need a dummy read to flush PCI DMAs */ 4142 1.1 riastrad if (!rdev->msi_enabled) 4143 1.1 riastrad RREG32(IH_RB_WPTR); 4144 1.1 riastrad 4145 1.1 riastrad wptr = r600_get_ih_wptr(rdev); 4146 1.1 riastrad 4147 1.1 riastrad restart_ih: 4148 1.1 riastrad /* is somebody else already processing irqs? */ 4149 1.1 riastrad if (atomic_xchg(&rdev->ih.lock, 1)) 4150 1.1 riastrad return IRQ_NONE; 4151 1.1 riastrad 4152 1.1 riastrad rptr = rdev->ih.rptr; 4153 1.1 riastrad DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); 4154 1.1 riastrad 4155 1.1 riastrad /* Order reading of wptr vs. reading of IH ring data */ 4156 1.1 riastrad rmb(); 4157 1.1 riastrad 4158 1.1 riastrad /* display interrupts */ 4159 1.1 riastrad r600_irq_ack(rdev); 4160 1.1 riastrad 4161 1.1 riastrad while (rptr != wptr) { 4162 1.1 riastrad /* wptr/rptr are in bytes! */ 4163 1.1 riastrad ring_index = rptr / 4; 4164 1.1 riastrad src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff; 4165 1.1 riastrad src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff; 4166 1.1 riastrad 4167 1.1 riastrad switch (src_id) { 4168 1.1 riastrad case 1: /* D1 vblank/vline */ 4169 1.1 riastrad switch (src_data) { 4170 1.1 riastrad case 0: /* D1 vblank */ 4171 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT)) 4172 1.1 riastrad DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n"); 4173 1.1 riastrad 4174 1.1 riastrad if (rdev->irq.crtc_vblank_int[0]) { 4175 1.1 riastrad drm_handle_vblank(rdev->ddev, 0); 4176 1.1 riastrad #ifdef __NetBSD__ 4177 1.1 riastrad spin_lock(&rdev->irq.vblank_lock); 4178 1.1 riastrad rdev->pm.vblank_sync = true; 4179 1.1 riastrad DRM_SPIN_WAKEUP_ONE(&rdev->irq.vblank_queue, &rdev->irq.vblank_lock); 4180 1.1 riastrad spin_unlock(&rdev->irq.vblank_lock); 4181 1.1 riastrad #else 4182 1.1 riastrad rdev->pm.vblank_sync = true; 4183 1.1 riastrad wake_up(&rdev->irq.vblank_queue); 4184 1.1 riastrad #endif 4185 1.1 riastrad } 4186 1.1 riastrad if (atomic_read(&rdev->irq.pflip[0])) 4187 1.1 riastrad radeon_crtc_handle_vblank(rdev, 0); 4188 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT; 4189 1.1 riastrad DRM_DEBUG("IH: D1 vblank\n"); 4190 1.1 riastrad 4191 1.1 riastrad break; 4192 1.1 riastrad case 1: /* D1 vline */ 4193 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT)) 4194 1.1 riastrad DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n"); 4195 1.1 riastrad 4196 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT; 4197 1.1 riastrad DRM_DEBUG("IH: D1 vline\n"); 4198 1.1 riastrad 4199 1.1 riastrad break; 4200 1.1 riastrad default: 4201 1.1 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 4202 1.1 riastrad break; 4203 1.1 riastrad } 4204 1.1 riastrad break; 4205 1.1 riastrad case 5: /* D2 vblank/vline */ 4206 1.1 riastrad switch (src_data) { 4207 1.1 riastrad case 0: /* D2 vblank */ 4208 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT)) 4209 1.1 riastrad DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n"); 4210 1.1 riastrad 4211 1.1 riastrad if (rdev->irq.crtc_vblank_int[1]) { 4212 1.1 riastrad drm_handle_vblank(rdev->ddev, 1); 4213 1.1 riastrad #ifdef __NetBSD__ 4214 1.1 riastrad spin_lock(&rdev->irq.vblank_lock); 4215 1.1 riastrad rdev->pm.vblank_sync = true; 4216 1.1 riastrad DRM_SPIN_WAKEUP_ONE(&rdev->irq.vblank_queue, &rdev->irq.vblank_lock); 4217 1.1 riastrad spin_unlock(&rdev->irq.vblank_lock); 4218 1.1 riastrad #else 4219 1.1 riastrad rdev->pm.vblank_sync = true; 4220 1.1 riastrad wake_up(&rdev->irq.vblank_queue); 4221 1.1 riastrad #endif 4222 1.1 riastrad } 4223 1.1 riastrad if (atomic_read(&rdev->irq.pflip[1])) 4224 1.1 riastrad radeon_crtc_handle_vblank(rdev, 1); 4225 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT; 4226 1.1 riastrad DRM_DEBUG("IH: D2 vblank\n"); 4227 1.1 riastrad 4228 1.1 riastrad break; 4229 1.1 riastrad case 1: /* D1 vline */ 4230 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT)) 4231 1.1 riastrad DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n"); 4232 1.1 riastrad 4233 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT; 4234 1.1 riastrad DRM_DEBUG("IH: D2 vline\n"); 4235 1.1 riastrad 4236 1.1 riastrad break; 4237 1.1 riastrad default: 4238 1.1 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 4239 1.1 riastrad break; 4240 1.1 riastrad } 4241 1.1 riastrad break; 4242 1.1 riastrad case 9: /* D1 pflip */ 4243 1.1 riastrad DRM_DEBUG("IH: D1 flip\n"); 4244 1.1 riastrad if (radeon_use_pflipirq > 0) 4245 1.1 riastrad radeon_crtc_handle_flip(rdev, 0); 4246 1.1 riastrad break; 4247 1.1 riastrad case 11: /* D2 pflip */ 4248 1.1 riastrad DRM_DEBUG("IH: D2 flip\n"); 4249 1.1 riastrad if (radeon_use_pflipirq > 0) 4250 1.1 riastrad radeon_crtc_handle_flip(rdev, 1); 4251 1.1 riastrad break; 4252 1.1 riastrad case 19: /* HPD/DAC hotplug */ 4253 1.1 riastrad switch (src_data) { 4254 1.1 riastrad case 0: 4255 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT)) 4256 1.1 riastrad DRM_DEBUG("IH: HPD1 - IH event w/o asserted irq bit?\n"); 4257 1.1 riastrad 4258 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT; 4259 1.1 riastrad queue_hotplug = true; 4260 1.1 riastrad DRM_DEBUG("IH: HPD1\n"); 4261 1.1 riastrad break; 4262 1.1 riastrad case 1: 4263 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT)) 4264 1.1 riastrad DRM_DEBUG("IH: HPD2 - IH event w/o asserted irq bit?\n"); 4265 1.1 riastrad 4266 1.1 riastrad rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT; 4267 1.1 riastrad queue_hotplug = true; 4268 1.1 riastrad DRM_DEBUG("IH: HPD2\n"); 4269 1.1 riastrad break; 4270 1.1 riastrad case 4: 4271 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT)) 4272 1.1 riastrad DRM_DEBUG("IH: HPD3 - IH event w/o asserted irq bit?\n"); 4273 1.1 riastrad 4274 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT; 4275 1.1 riastrad queue_hotplug = true; 4276 1.1 riastrad DRM_DEBUG("IH: HPD3\n"); 4277 1.1 riastrad break; 4278 1.1 riastrad case 5: 4279 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT)) 4280 1.1 riastrad DRM_DEBUG("IH: HPD4 - IH event w/o asserted irq bit?\n"); 4281 1.1 riastrad 4282 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT; 4283 1.1 riastrad queue_hotplug = true; 4284 1.1 riastrad DRM_DEBUG("IH: HPD4\n"); 4285 1.1 riastrad break; 4286 1.1 riastrad case 10: 4287 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT)) 4288 1.1 riastrad DRM_DEBUG("IH: HPD5 - IH event w/o asserted irq bit?\n"); 4289 1.1 riastrad 4290 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT; 4291 1.1 riastrad queue_hotplug = true; 4292 1.1 riastrad DRM_DEBUG("IH: HPD5\n"); 4293 1.1 riastrad break; 4294 1.1 riastrad case 12: 4295 1.1 riastrad if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT)) 4296 1.1 riastrad DRM_DEBUG("IH: HPD6 - IH event w/o asserted irq bit?\n"); 4297 1.1 riastrad 4298 1.1 riastrad rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT; 4299 1.1 riastrad queue_hotplug = true; 4300 1.1 riastrad DRM_DEBUG("IH: HPD6\n"); 4301 1.1 riastrad 4302 1.1 riastrad break; 4303 1.1 riastrad default: 4304 1.1 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 4305 1.1 riastrad break; 4306 1.1 riastrad } 4307 1.1 riastrad break; 4308 1.1 riastrad case 21: /* hdmi */ 4309 1.1 riastrad switch (src_data) { 4310 1.1 riastrad case 4: 4311 1.1 riastrad if (!(rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG)) 4312 1.1 riastrad DRM_DEBUG("IH: HDMI0 - IH event w/o asserted irq bit?\n"); 4313 1.1 riastrad 4314 1.1 riastrad rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG; 4315 1.1 riastrad queue_hdmi = true; 4316 1.1 riastrad DRM_DEBUG("IH: HDMI0\n"); 4317 1.1 riastrad 4318 1.1 riastrad break; 4319 1.1 riastrad case 5: 4320 1.1 riastrad if (!(rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG)) 4321 1.1 riastrad DRM_DEBUG("IH: HDMI1 - IH event w/o asserted irq bit?\n"); 4322 1.1 riastrad 4323 1.1 riastrad rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG; 4324 1.1 riastrad queue_hdmi = true; 4325 1.1 riastrad DRM_DEBUG("IH: HDMI1\n"); 4326 1.1 riastrad 4327 1.1 riastrad break; 4328 1.1 riastrad default: 4329 1.1 riastrad DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); 4330 1.1 riastrad break; 4331 1.1 riastrad } 4332 1.1 riastrad break; 4333 1.1 riastrad case 124: /* UVD */ 4334 1.1 riastrad DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); 4335 1.1 riastrad radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); 4336 1.1 riastrad break; 4337 1.1 riastrad case 176: /* CP_INT in ring buffer */ 4338 1.1 riastrad case 177: /* CP_INT in IB1 */ 4339 1.1 riastrad case 178: /* CP_INT in IB2 */ 4340 1.1 riastrad DRM_DEBUG("IH: CP int: 0x%08x\n", src_data); 4341 1.1 riastrad radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 4342 1.1 riastrad break; 4343 1.1 riastrad case 181: /* CP EOP event */ 4344 1.1 riastrad DRM_DEBUG("IH: CP EOP\n"); 4345 1.1 riastrad radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 4346 1.1 riastrad break; 4347 1.1 riastrad case 224: /* DMA trap event */ 4348 1.1 riastrad DRM_DEBUG("IH: DMA trap\n"); 4349 1.1 riastrad radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX); 4350 1.1 riastrad break; 4351 1.1 riastrad case 230: /* thermal low to high */ 4352 1.1 riastrad DRM_DEBUG("IH: thermal low to high\n"); 4353 1.1 riastrad rdev->pm.dpm.thermal.high_to_low = false; 4354 1.1 riastrad queue_thermal = true; 4355 1.1 riastrad break; 4356 1.1 riastrad case 231: /* thermal high to low */ 4357 1.1 riastrad DRM_DEBUG("IH: thermal high to low\n"); 4358 1.1 riastrad rdev->pm.dpm.thermal.high_to_low = true; 4359 1.1 riastrad queue_thermal = true; 4360 1.1 riastrad break; 4361 1.1 riastrad case 233: /* GUI IDLE */ 4362 1.1 riastrad DRM_DEBUG("IH: GUI idle\n"); 4363 1.1 riastrad break; 4364 1.1 riastrad default: 4365 1.1 riastrad DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 4366 1.1 riastrad break; 4367 1.1 riastrad } 4368 1.1 riastrad 4369 1.1 riastrad /* wptr/rptr are in bytes! */ 4370 1.1 riastrad rptr += 16; 4371 1.1 riastrad rptr &= rdev->ih.ptr_mask; 4372 1.1 riastrad WREG32(IH_RB_RPTR, rptr); 4373 1.1 riastrad } 4374 1.1 riastrad if (queue_hotplug) 4375 1.1 riastrad schedule_delayed_work(&rdev->hotplug_work, 0); 4376 1.1 riastrad if (queue_hdmi) 4377 1.1 riastrad schedule_work(&rdev->audio_work); 4378 1.1 riastrad if (queue_thermal && rdev->pm.dpm_enabled) 4379 1.1 riastrad schedule_work(&rdev->pm.dpm.thermal.work); 4380 1.1 riastrad rdev->ih.rptr = rptr; 4381 1.1 riastrad atomic_set(&rdev->ih.lock, 0); 4382 1.1 riastrad 4383 1.1 riastrad /* make sure wptr hasn't changed while processing */ 4384 1.1 riastrad wptr = r600_get_ih_wptr(rdev); 4385 1.1 riastrad if (wptr != rptr) 4386 1.1 riastrad goto restart_ih; 4387 1.1 riastrad 4388 1.1 riastrad return IRQ_HANDLED; 4389 1.1 riastrad } 4390 1.1 riastrad 4391 1.1 riastrad /* 4392 1.1 riastrad * Debugfs info 4393 1.1 riastrad */ 4394 1.1 riastrad #if defined(CONFIG_DEBUG_FS) 4395 1.1 riastrad 4396 1.1 riastrad static int r600_debugfs_mc_info(struct seq_file *m, void *data) 4397 1.1 riastrad { 4398 1.1 riastrad struct drm_info_node *node = (struct drm_info_node *) m->private; 4399 1.1 riastrad struct drm_device *dev = node->minor->dev; 4400 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 4401 1.1 riastrad 4402 1.1 riastrad DREG32_SYS(m, rdev, R_000E50_SRBM_STATUS); 4403 1.1 riastrad DREG32_SYS(m, rdev, VM_L2_STATUS); 4404 1.1 riastrad return 0; 4405 1.1 riastrad } 4406 1.1 riastrad 4407 1.1 riastrad static struct drm_info_list r600_mc_info_list[] = { 4408 1.1 riastrad {"r600_mc_info", r600_debugfs_mc_info, 0, NULL}, 4409 1.1 riastrad }; 4410 1.1 riastrad #endif 4411 1.1 riastrad 4412 1.1 riastrad int r600_debugfs_mc_info_init(struct radeon_device *rdev) 4413 1.1 riastrad { 4414 1.1 riastrad #if defined(CONFIG_DEBUG_FS) 4415 1.1 riastrad return radeon_debugfs_add_files(rdev, r600_mc_info_list, ARRAY_SIZE(r600_mc_info_list)); 4416 1.1 riastrad #else 4417 1.1 riastrad return 0; 4418 1.1 riastrad #endif 4419 1.1 riastrad } 4420 1.1 riastrad 4421 1.1 riastrad #ifdef __NetBSD__ 4422 1.1 riastrad # define __iomem volatile 4423 1.1 riastrad # define readl fake_readl 4424 1.1 riastrad #endif 4425 1.1 riastrad 4426 1.1 riastrad /** 4427 1.1 riastrad * r600_mmio_hdp_flush - flush Host Data Path cache via MMIO 4428 1.1 riastrad * rdev: radeon device structure 4429 1.1 riastrad * 4430 1.1 riastrad * Some R6XX/R7XX don't seem to take into account HDP flushes performed 4431 1.1 riastrad * through the ring buffer. This leads to corruption in rendering, see 4432 1.1 riastrad * http://bugzilla.kernel.org/show_bug.cgi?id=15186 . To avoid this, we 4433 1.1 riastrad * directly perform the HDP flush by writing the register through MMIO. 4434 1.1 riastrad */ 4435 1.1 riastrad void r600_mmio_hdp_flush(struct radeon_device *rdev) 4436 1.1 riastrad { 4437 1.1 riastrad /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read 4438 1.1 riastrad * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL. 4439 1.1 riastrad * This seems to cause problems on some AGP cards. Just use the old 4440 1.1 riastrad * method for them. 4441 1.1 riastrad */ 4442 1.1 riastrad if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && 4443 1.1 riastrad rdev->vram_scratch.ptr && !(rdev->flags & RADEON_IS_AGP)) { 4444 1.1 riastrad void __iomem *ptr = rdev->vram_scratch.ptr; 4445 1.1 riastrad 4446 1.1 riastrad WREG32(HDP_DEBUG1, 0); 4447 1.1 riastrad (void)readl(ptr); 4448 1.1 riastrad } else 4449 1.1 riastrad WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 4450 1.1 riastrad } 4451 1.1 riastrad 4452 1.1 riastrad #ifdef __NetBSD__ 4453 1.1 riastrad # undef __iomem 4454 1.1 riastrad # undef readl 4455 1.1 riastrad #endif 4456 1.1 riastrad 4457 1.1 riastrad void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes) 4458 1.1 riastrad { 4459 1.1 riastrad u32 link_width_cntl, mask; 4460 1.1 riastrad 4461 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 4462 1.1 riastrad return; 4463 1.1 riastrad 4464 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 4465 1.1 riastrad return; 4466 1.1 riastrad 4467 1.1 riastrad /* x2 cards have a special sequence */ 4468 1.1 riastrad if (ASIC_IS_X2(rdev)) 4469 1.1 riastrad return; 4470 1.1 riastrad 4471 1.1 riastrad radeon_gui_idle(rdev); 4472 1.1 riastrad 4473 1.1 riastrad switch (lanes) { 4474 1.1 riastrad case 0: 4475 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X0; 4476 1.1 riastrad break; 4477 1.1 riastrad case 1: 4478 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X1; 4479 1.1 riastrad break; 4480 1.1 riastrad case 2: 4481 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X2; 4482 1.1 riastrad break; 4483 1.1 riastrad case 4: 4484 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X4; 4485 1.1 riastrad break; 4486 1.1 riastrad case 8: 4487 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X8; 4488 1.1 riastrad break; 4489 1.1 riastrad case 12: 4490 1.1 riastrad /* not actually supported */ 4491 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X12; 4492 1.1 riastrad break; 4493 1.1 riastrad case 16: 4494 1.1 riastrad mask = RADEON_PCIE_LC_LINK_WIDTH_X16; 4495 1.1 riastrad break; 4496 1.1 riastrad default: 4497 1.1 riastrad DRM_ERROR("invalid pcie lane request: %d\n", lanes); 4498 1.1 riastrad return; 4499 1.1 riastrad } 4500 1.1 riastrad 4501 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 4502 1.1 riastrad link_width_cntl &= ~RADEON_PCIE_LC_LINK_WIDTH_MASK; 4503 1.1 riastrad link_width_cntl |= mask << RADEON_PCIE_LC_LINK_WIDTH_SHIFT; 4504 1.1 riastrad link_width_cntl |= (RADEON_PCIE_LC_RECONFIG_NOW | 4505 1.1 riastrad R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE); 4506 1.1 riastrad 4507 1.1 riastrad WREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 4508 1.1 riastrad } 4509 1.1 riastrad 4510 1.1 riastrad int r600_get_pcie_lanes(struct radeon_device *rdev) 4511 1.1 riastrad { 4512 1.1 riastrad u32 link_width_cntl; 4513 1.1 riastrad 4514 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 4515 1.1 riastrad return 0; 4516 1.1 riastrad 4517 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 4518 1.1 riastrad return 0; 4519 1.1 riastrad 4520 1.1 riastrad /* x2 cards have a special sequence */ 4521 1.1 riastrad if (ASIC_IS_X2(rdev)) 4522 1.1 riastrad return 0; 4523 1.1 riastrad 4524 1.1 riastrad radeon_gui_idle(rdev); 4525 1.1 riastrad 4526 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 4527 1.1 riastrad 4528 1.1 riastrad switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { 4529 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X1: 4530 1.1 riastrad return 1; 4531 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X2: 4532 1.1 riastrad return 2; 4533 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X4: 4534 1.1 riastrad return 4; 4535 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X8: 4536 1.1 riastrad return 8; 4537 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X12: 4538 1.1 riastrad /* not actually supported */ 4539 1.1 riastrad return 12; 4540 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X0: 4541 1.1 riastrad case RADEON_PCIE_LC_LINK_WIDTH_X16: 4542 1.1 riastrad default: 4543 1.1 riastrad return 16; 4544 1.1 riastrad } 4545 1.1 riastrad } 4546 1.1 riastrad 4547 1.1 riastrad static void r600_pcie_gen2_enable(struct radeon_device *rdev) 4548 1.1 riastrad { 4549 1.1 riastrad u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp; 4550 1.1 riastrad u16 link_cntl2; 4551 1.1 riastrad 4552 1.1 riastrad if (radeon_pcie_gen2 == 0) 4553 1.1 riastrad return; 4554 1.1 riastrad 4555 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 4556 1.1 riastrad return; 4557 1.1 riastrad 4558 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 4559 1.1 riastrad return; 4560 1.1 riastrad 4561 1.1 riastrad /* x2 cards have a special sequence */ 4562 1.1 riastrad if (ASIC_IS_X2(rdev)) 4563 1.1 riastrad return; 4564 1.1 riastrad 4565 1.1 riastrad /* only RV6xx+ chips are supported */ 4566 1.1 riastrad if (rdev->family <= CHIP_R600) 4567 1.1 riastrad return; 4568 1.1 riastrad 4569 1.1 riastrad if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && 4570 1.1 riastrad (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) 4571 1.1 riastrad return; 4572 1.1 riastrad 4573 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 4574 1.1 riastrad if (speed_cntl & LC_CURRENT_DATA_RATE) { 4575 1.1 riastrad DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 4576 1.1 riastrad return; 4577 1.1 riastrad } 4578 1.1 riastrad 4579 1.1 riastrad DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); 4580 1.1 riastrad 4581 1.1 riastrad /* 55 nm r6xx asics */ 4582 1.1 riastrad if ((rdev->family == CHIP_RV670) || 4583 1.1 riastrad (rdev->family == CHIP_RV620) || 4584 1.1 riastrad (rdev->family == CHIP_RV635)) { 4585 1.1 riastrad /* advertise upconfig capability */ 4586 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 4587 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 4588 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 4589 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 4590 1.1 riastrad if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) { 4591 1.1 riastrad lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT; 4592 1.1 riastrad link_width_cntl &= ~(LC_LINK_WIDTH_MASK | 4593 1.1 riastrad LC_RECONFIG_ARC_MISSING_ESCAPE); 4594 1.1 riastrad link_width_cntl |= lanes | LC_RECONFIG_NOW | LC_RENEGOTIATE_EN; 4595 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 4596 1.1 riastrad } else { 4597 1.1 riastrad link_width_cntl |= LC_UPCONFIGURE_DIS; 4598 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 4599 1.1 riastrad } 4600 1.1 riastrad } 4601 1.1 riastrad 4602 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 4603 1.1 riastrad if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) && 4604 1.1 riastrad (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 4605 1.1 riastrad 4606 1.1 riastrad /* 55 nm r6xx asics */ 4607 1.1 riastrad if ((rdev->family == CHIP_RV670) || 4608 1.1 riastrad (rdev->family == CHIP_RV620) || 4609 1.1 riastrad (rdev->family == CHIP_RV635)) { 4610 1.1 riastrad WREG32(MM_CFGREGS_CNTL, 0x8); 4611 1.1 riastrad link_cntl2 = RREG32(0x4088); 4612 1.1 riastrad WREG32(MM_CFGREGS_CNTL, 0); 4613 1.1 riastrad /* not supported yet */ 4614 1.1 riastrad if (link_cntl2 & SELECTABLE_DEEMPHASIS) 4615 1.1 riastrad return; 4616 1.1 riastrad } 4617 1.1 riastrad 4618 1.1 riastrad speed_cntl &= ~LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK; 4619 1.1 riastrad speed_cntl |= (0x3 << LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT); 4620 1.1 riastrad speed_cntl &= ~LC_VOLTAGE_TIMER_SEL_MASK; 4621 1.1 riastrad speed_cntl &= ~LC_FORCE_DIS_HW_SPEED_CHANGE; 4622 1.1 riastrad speed_cntl |= LC_FORCE_EN_HW_SPEED_CHANGE; 4623 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 4624 1.1 riastrad 4625 1.1 riastrad tmp = RREG32(0x541c); 4626 1.1 riastrad WREG32(0x541c, tmp | 0x8); 4627 1.1 riastrad WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN); 4628 1.1 riastrad link_cntl2 = RREG16(0x4088); 4629 1.1 riastrad link_cntl2 &= ~TARGET_LINK_SPEED_MASK; 4630 1.1 riastrad link_cntl2 |= 0x2; 4631 1.1 riastrad WREG16(0x4088, link_cntl2); 4632 1.1 riastrad WREG32(MM_CFGREGS_CNTL, 0); 4633 1.1 riastrad 4634 1.1 riastrad if ((rdev->family == CHIP_RV670) || 4635 1.1 riastrad (rdev->family == CHIP_RV620) || 4636 1.1 riastrad (rdev->family == CHIP_RV635)) { 4637 1.1 riastrad training_cntl = RREG32_PCIE_PORT(PCIE_LC_TRAINING_CNTL); 4638 1.1 riastrad training_cntl &= ~LC_POINT_7_PLUS_EN; 4639 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_TRAINING_CNTL, training_cntl); 4640 1.1 riastrad } else { 4641 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 4642 1.1 riastrad speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 4643 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 4644 1.1 riastrad } 4645 1.1 riastrad 4646 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 4647 1.1 riastrad speed_cntl |= LC_GEN2_EN_STRAP; 4648 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 4649 1.1 riastrad 4650 1.1 riastrad } else { 4651 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 4652 1.1 riastrad /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 4653 1.1 riastrad if (1) 4654 1.1 riastrad link_width_cntl |= LC_UPCONFIGURE_DIS; 4655 1.1 riastrad else 4656 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 4657 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 4658 1.1 riastrad } 4659 1.1 riastrad } 4660 1.1 riastrad 4661 1.1 riastrad /** 4662 1.1 riastrad * r600_get_gpu_clock_counter - return GPU clock counter snapshot 4663 1.1 riastrad * 4664 1.1 riastrad * @rdev: radeon_device pointer 4665 1.1 riastrad * 4666 1.1 riastrad * Fetches a GPU clock counter snapshot (R6xx-cayman). 4667 1.1 riastrad * Returns the 64 bit clock counter snapshot. 4668 1.1 riastrad */ 4669 1.1 riastrad uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev) 4670 1.1 riastrad { 4671 1.1 riastrad uint64_t clock; 4672 1.1 riastrad 4673 1.1 riastrad mutex_lock(&rdev->gpu_clock_mutex); 4674 1.1 riastrad WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1); 4675 1.1 riastrad clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) | 4676 1.6 riastrad ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL); 4677 1.1 riastrad mutex_unlock(&rdev->gpu_clock_mutex); 4678 1.1 riastrad return clock; 4679 1.1 riastrad } 4680