1 1.3 mrg /* $NetBSD: radeon_rv770.c,v 1.3 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.2 riastrad 31 1.1 riastrad #include <sys/cdefs.h> 32 1.3 mrg __KERNEL_RCSID(0, "$NetBSD: radeon_rv770.c,v 1.3 2023/09/30 10:46:45 mrg Exp $"); 33 1.1 riastrad 34 1.1 riastrad #include <linux/firmware.h> 35 1.2 riastrad #include <linux/pci.h> 36 1.1 riastrad #include <linux/slab.h> 37 1.2 riastrad 38 1.2 riastrad #include <drm/drm_device.h> 39 1.2 riastrad #include <drm/radeon_drm.h> 40 1.2 riastrad 41 1.2 riastrad #include "atom.h" 42 1.2 riastrad #include "avivod.h" 43 1.1 riastrad #include "radeon.h" 44 1.1 riastrad #include "radeon_asic.h" 45 1.1 riastrad #include "radeon_audio.h" 46 1.1 riastrad #include "rv770d.h" 47 1.1 riastrad 48 1.1 riastrad #define R700_PFP_UCODE_SIZE 848 49 1.1 riastrad #define R700_PM4_UCODE_SIZE 1360 50 1.1 riastrad 51 1.1 riastrad static void rv770_gpu_init(struct radeon_device *rdev); 52 1.1 riastrad void rv770_fini(struct radeon_device *rdev); 53 1.1 riastrad static void rv770_pcie_gen2_enable(struct radeon_device *rdev); 54 1.1 riastrad int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 55 1.1 riastrad 56 1.1 riastrad int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) 57 1.1 riastrad { 58 1.1 riastrad unsigned fb_div = 0, vclk_div = 0, dclk_div = 0; 59 1.1 riastrad int r; 60 1.1 riastrad 61 1.1 riastrad /* RV740 uses evergreen uvd clk programming */ 62 1.1 riastrad if (rdev->family == CHIP_RV740) 63 1.1 riastrad return evergreen_set_uvd_clocks(rdev, vclk, dclk); 64 1.1 riastrad 65 1.1 riastrad /* bypass vclk and dclk with bclk */ 66 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 67 1.1 riastrad VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1), 68 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 69 1.1 riastrad 70 1.1 riastrad if (!vclk || !dclk) { 71 1.1 riastrad /* keep the Bypass mode, put PLL to sleep */ 72 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); 73 1.1 riastrad return 0; 74 1.1 riastrad } 75 1.1 riastrad 76 1.1 riastrad r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000, 77 1.1 riastrad 43663, 0x03FFFFFE, 1, 30, ~0, 78 1.1 riastrad &fb_div, &vclk_div, &dclk_div); 79 1.1 riastrad if (r) 80 1.1 riastrad return r; 81 1.1 riastrad 82 1.1 riastrad fb_div |= 1; 83 1.1 riastrad vclk_div -= 1; 84 1.1 riastrad dclk_div -= 1; 85 1.1 riastrad 86 1.1 riastrad /* set UPLL_FB_DIV to 0x50000 */ 87 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK); 88 1.1 riastrad 89 1.1 riastrad /* deassert UPLL_RESET and UPLL_SLEEP */ 90 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK)); 91 1.1 riastrad 92 1.1 riastrad /* assert BYPASS EN and FB_DIV[0] <- ??? why? */ 93 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); 94 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1)); 95 1.1 riastrad 96 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 97 1.1 riastrad if (r) 98 1.1 riastrad return r; 99 1.1 riastrad 100 1.1 riastrad /* assert PLL_RESET */ 101 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK); 102 1.1 riastrad 103 1.1 riastrad /* set the required FB_DIV, REF_DIV, Post divder values */ 104 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK); 105 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 106 1.1 riastrad UPLL_SW_HILEN(vclk_div >> 1) | 107 1.1 riastrad UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) | 108 1.1 riastrad UPLL_SW_HILEN2(dclk_div >> 1) | 109 1.1 riastrad UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)), 110 1.1 riastrad ~UPLL_SW_MASK); 111 1.1 riastrad 112 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), 113 1.1 riastrad ~UPLL_FB_DIV_MASK); 114 1.1 riastrad 115 1.1 riastrad /* give the PLL some time to settle */ 116 1.1 riastrad mdelay(15); 117 1.1 riastrad 118 1.1 riastrad /* deassert PLL_RESET */ 119 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK); 120 1.1 riastrad 121 1.1 riastrad mdelay(15); 122 1.1 riastrad 123 1.1 riastrad /* deassert BYPASS EN and FB_DIV[0] <- ??? why? */ 124 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK); 125 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1)); 126 1.1 riastrad 127 1.1 riastrad r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 128 1.1 riastrad if (r) 129 1.1 riastrad return r; 130 1.1 riastrad 131 1.1 riastrad /* switch VCLK and DCLK selection */ 132 1.1 riastrad WREG32_P(CG_UPLL_FUNC_CNTL_2, 133 1.1 riastrad VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2), 134 1.1 riastrad ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 135 1.1 riastrad 136 1.1 riastrad mdelay(100); 137 1.1 riastrad 138 1.1 riastrad return 0; 139 1.1 riastrad } 140 1.1 riastrad 141 1.1 riastrad static const u32 r7xx_golden_registers[] = 142 1.1 riastrad { 143 1.1 riastrad 0x8d00, 0xffffffff, 0x0e0e0074, 144 1.1 riastrad 0x8d04, 0xffffffff, 0x013a2b34, 145 1.1 riastrad 0x9508, 0xffffffff, 0x00000002, 146 1.1 riastrad 0x8b20, 0xffffffff, 0, 147 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 148 1.1 riastrad 0x28350, 0xffffffff, 0, 149 1.1 riastrad 0x9058, 0xffffffff, 0x0fffc40f, 150 1.1 riastrad 0x240c, 0xffffffff, 0x00000380, 151 1.1 riastrad 0x733c, 0xffffffff, 0x00000002, 152 1.1 riastrad 0x2650, 0x00040000, 0, 153 1.1 riastrad 0x20bc, 0x00040000, 0, 154 1.1 riastrad 0x7300, 0xffffffff, 0x001000f0 155 1.1 riastrad }; 156 1.1 riastrad 157 1.1 riastrad static const u32 r7xx_golden_dyn_gpr_registers[] = 158 1.1 riastrad { 159 1.1 riastrad 0x8db0, 0xffffffff, 0x98989898, 160 1.1 riastrad 0x8db4, 0xffffffff, 0x98989898, 161 1.1 riastrad 0x8db8, 0xffffffff, 0x98989898, 162 1.1 riastrad 0x8dbc, 0xffffffff, 0x98989898, 163 1.1 riastrad 0x8dc0, 0xffffffff, 0x98989898, 164 1.1 riastrad 0x8dc4, 0xffffffff, 0x98989898, 165 1.1 riastrad 0x8dc8, 0xffffffff, 0x98989898, 166 1.1 riastrad 0x8dcc, 0xffffffff, 0x98989898, 167 1.1 riastrad 0x88c4, 0xffffffff, 0x00000082 168 1.1 riastrad }; 169 1.1 riastrad 170 1.1 riastrad static const u32 rv770_golden_registers[] = 171 1.1 riastrad { 172 1.1 riastrad 0x562c, 0xffffffff, 0, 173 1.1 riastrad 0x3f90, 0xffffffff, 0, 174 1.1 riastrad 0x9148, 0xffffffff, 0, 175 1.1 riastrad 0x3f94, 0xffffffff, 0, 176 1.1 riastrad 0x914c, 0xffffffff, 0, 177 1.1 riastrad 0x9698, 0x18000000, 0x18000000 178 1.1 riastrad }; 179 1.1 riastrad 180 1.1 riastrad static const u32 rv770ce_golden_registers[] = 181 1.1 riastrad { 182 1.1 riastrad 0x562c, 0xffffffff, 0, 183 1.1 riastrad 0x3f90, 0xffffffff, 0x00cc0000, 184 1.1 riastrad 0x9148, 0xffffffff, 0x00cc0000, 185 1.1 riastrad 0x3f94, 0xffffffff, 0x00cc0000, 186 1.1 riastrad 0x914c, 0xffffffff, 0x00cc0000, 187 1.1 riastrad 0x9b7c, 0xffffffff, 0x00fa0000, 188 1.1 riastrad 0x3f8c, 0xffffffff, 0x00fa0000, 189 1.1 riastrad 0x9698, 0x18000000, 0x18000000 190 1.1 riastrad }; 191 1.1 riastrad 192 1.1 riastrad static const u32 rv770_mgcg_init[] = 193 1.1 riastrad { 194 1.1 riastrad 0x8bcc, 0xffffffff, 0x130300f9, 195 1.1 riastrad 0x5448, 0xffffffff, 0x100, 196 1.1 riastrad 0x55e4, 0xffffffff, 0x100, 197 1.1 riastrad 0x160c, 0xffffffff, 0x100, 198 1.1 riastrad 0x5644, 0xffffffff, 0x100, 199 1.1 riastrad 0xc164, 0xffffffff, 0x100, 200 1.1 riastrad 0x8a18, 0xffffffff, 0x100, 201 1.1 riastrad 0x897c, 0xffffffff, 0x8000100, 202 1.1 riastrad 0x8b28, 0xffffffff, 0x3c000100, 203 1.1 riastrad 0x9144, 0xffffffff, 0x100, 204 1.1 riastrad 0x9a1c, 0xffffffff, 0x10000, 205 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 206 1.1 riastrad 0x9a1c, 0xffffffff, 0x10001, 207 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 208 1.1 riastrad 0x9a1c, 0xffffffff, 0x10002, 209 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 210 1.1 riastrad 0x9a1c, 0xffffffff, 0x10003, 211 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 212 1.1 riastrad 0x9a1c, 0xffffffff, 0x0, 213 1.1 riastrad 0x9870, 0xffffffff, 0x100, 214 1.1 riastrad 0x8d58, 0xffffffff, 0x100, 215 1.1 riastrad 0x9500, 0xffffffff, 0x0, 216 1.1 riastrad 0x9510, 0xffffffff, 0x100, 217 1.1 riastrad 0x9500, 0xffffffff, 0x1, 218 1.1 riastrad 0x9510, 0xffffffff, 0x100, 219 1.1 riastrad 0x9500, 0xffffffff, 0x2, 220 1.1 riastrad 0x9510, 0xffffffff, 0x100, 221 1.1 riastrad 0x9500, 0xffffffff, 0x3, 222 1.1 riastrad 0x9510, 0xffffffff, 0x100, 223 1.1 riastrad 0x9500, 0xffffffff, 0x4, 224 1.1 riastrad 0x9510, 0xffffffff, 0x100, 225 1.1 riastrad 0x9500, 0xffffffff, 0x5, 226 1.1 riastrad 0x9510, 0xffffffff, 0x100, 227 1.1 riastrad 0x9500, 0xffffffff, 0x6, 228 1.1 riastrad 0x9510, 0xffffffff, 0x100, 229 1.1 riastrad 0x9500, 0xffffffff, 0x7, 230 1.1 riastrad 0x9510, 0xffffffff, 0x100, 231 1.1 riastrad 0x9500, 0xffffffff, 0x8, 232 1.1 riastrad 0x9510, 0xffffffff, 0x100, 233 1.1 riastrad 0x9500, 0xffffffff, 0x9, 234 1.1 riastrad 0x9510, 0xffffffff, 0x100, 235 1.1 riastrad 0x9500, 0xffffffff, 0x8000, 236 1.1 riastrad 0x9490, 0xffffffff, 0x0, 237 1.1 riastrad 0x949c, 0xffffffff, 0x100, 238 1.1 riastrad 0x9490, 0xffffffff, 0x1, 239 1.1 riastrad 0x949c, 0xffffffff, 0x100, 240 1.1 riastrad 0x9490, 0xffffffff, 0x2, 241 1.1 riastrad 0x949c, 0xffffffff, 0x100, 242 1.1 riastrad 0x9490, 0xffffffff, 0x3, 243 1.1 riastrad 0x949c, 0xffffffff, 0x100, 244 1.1 riastrad 0x9490, 0xffffffff, 0x4, 245 1.1 riastrad 0x949c, 0xffffffff, 0x100, 246 1.1 riastrad 0x9490, 0xffffffff, 0x5, 247 1.1 riastrad 0x949c, 0xffffffff, 0x100, 248 1.1 riastrad 0x9490, 0xffffffff, 0x6, 249 1.1 riastrad 0x949c, 0xffffffff, 0x100, 250 1.1 riastrad 0x9490, 0xffffffff, 0x7, 251 1.1 riastrad 0x949c, 0xffffffff, 0x100, 252 1.1 riastrad 0x9490, 0xffffffff, 0x8, 253 1.1 riastrad 0x949c, 0xffffffff, 0x100, 254 1.1 riastrad 0x9490, 0xffffffff, 0x9, 255 1.1 riastrad 0x949c, 0xffffffff, 0x100, 256 1.1 riastrad 0x9490, 0xffffffff, 0x8000, 257 1.1 riastrad 0x9604, 0xffffffff, 0x0, 258 1.1 riastrad 0x9654, 0xffffffff, 0x100, 259 1.1 riastrad 0x9604, 0xffffffff, 0x1, 260 1.1 riastrad 0x9654, 0xffffffff, 0x100, 261 1.1 riastrad 0x9604, 0xffffffff, 0x2, 262 1.1 riastrad 0x9654, 0xffffffff, 0x100, 263 1.1 riastrad 0x9604, 0xffffffff, 0x3, 264 1.1 riastrad 0x9654, 0xffffffff, 0x100, 265 1.1 riastrad 0x9604, 0xffffffff, 0x4, 266 1.1 riastrad 0x9654, 0xffffffff, 0x100, 267 1.1 riastrad 0x9604, 0xffffffff, 0x5, 268 1.1 riastrad 0x9654, 0xffffffff, 0x100, 269 1.1 riastrad 0x9604, 0xffffffff, 0x6, 270 1.1 riastrad 0x9654, 0xffffffff, 0x100, 271 1.1 riastrad 0x9604, 0xffffffff, 0x7, 272 1.1 riastrad 0x9654, 0xffffffff, 0x100, 273 1.1 riastrad 0x9604, 0xffffffff, 0x8, 274 1.1 riastrad 0x9654, 0xffffffff, 0x100, 275 1.1 riastrad 0x9604, 0xffffffff, 0x9, 276 1.1 riastrad 0x9654, 0xffffffff, 0x100, 277 1.1 riastrad 0x9604, 0xffffffff, 0x80000000, 278 1.1 riastrad 0x9030, 0xffffffff, 0x100, 279 1.1 riastrad 0x9034, 0xffffffff, 0x100, 280 1.1 riastrad 0x9038, 0xffffffff, 0x100, 281 1.1 riastrad 0x903c, 0xffffffff, 0x100, 282 1.1 riastrad 0x9040, 0xffffffff, 0x100, 283 1.1 riastrad 0xa200, 0xffffffff, 0x100, 284 1.1 riastrad 0xa204, 0xffffffff, 0x100, 285 1.1 riastrad 0xa208, 0xffffffff, 0x100, 286 1.1 riastrad 0xa20c, 0xffffffff, 0x100, 287 1.1 riastrad 0x971c, 0xffffffff, 0x100, 288 1.1 riastrad 0x915c, 0xffffffff, 0x00020001, 289 1.1 riastrad 0x9160, 0xffffffff, 0x00040003, 290 1.1 riastrad 0x916c, 0xffffffff, 0x00060005, 291 1.1 riastrad 0x9170, 0xffffffff, 0x00080007, 292 1.1 riastrad 0x9174, 0xffffffff, 0x000a0009, 293 1.1 riastrad 0x9178, 0xffffffff, 0x000c000b, 294 1.1 riastrad 0x917c, 0xffffffff, 0x000e000d, 295 1.1 riastrad 0x9180, 0xffffffff, 0x0010000f, 296 1.1 riastrad 0x918c, 0xffffffff, 0x00120011, 297 1.1 riastrad 0x9190, 0xffffffff, 0x00140013, 298 1.1 riastrad 0x9194, 0xffffffff, 0x00020001, 299 1.1 riastrad 0x9198, 0xffffffff, 0x00040003, 300 1.1 riastrad 0x919c, 0xffffffff, 0x00060005, 301 1.1 riastrad 0x91a8, 0xffffffff, 0x00080007, 302 1.1 riastrad 0x91ac, 0xffffffff, 0x000a0009, 303 1.1 riastrad 0x91b0, 0xffffffff, 0x000c000b, 304 1.1 riastrad 0x91b4, 0xffffffff, 0x000e000d, 305 1.1 riastrad 0x91b8, 0xffffffff, 0x0010000f, 306 1.1 riastrad 0x91c4, 0xffffffff, 0x00120011, 307 1.1 riastrad 0x91c8, 0xffffffff, 0x00140013, 308 1.1 riastrad 0x91cc, 0xffffffff, 0x00020001, 309 1.1 riastrad 0x91d0, 0xffffffff, 0x00040003, 310 1.1 riastrad 0x91d4, 0xffffffff, 0x00060005, 311 1.1 riastrad 0x91e0, 0xffffffff, 0x00080007, 312 1.1 riastrad 0x91e4, 0xffffffff, 0x000a0009, 313 1.1 riastrad 0x91e8, 0xffffffff, 0x000c000b, 314 1.1 riastrad 0x91ec, 0xffffffff, 0x00020001, 315 1.1 riastrad 0x91f0, 0xffffffff, 0x00040003, 316 1.1 riastrad 0x91f4, 0xffffffff, 0x00060005, 317 1.1 riastrad 0x9200, 0xffffffff, 0x00080007, 318 1.1 riastrad 0x9204, 0xffffffff, 0x000a0009, 319 1.1 riastrad 0x9208, 0xffffffff, 0x000c000b, 320 1.1 riastrad 0x920c, 0xffffffff, 0x000e000d, 321 1.1 riastrad 0x9210, 0xffffffff, 0x0010000f, 322 1.1 riastrad 0x921c, 0xffffffff, 0x00120011, 323 1.1 riastrad 0x9220, 0xffffffff, 0x00140013, 324 1.1 riastrad 0x9224, 0xffffffff, 0x00020001, 325 1.1 riastrad 0x9228, 0xffffffff, 0x00040003, 326 1.1 riastrad 0x922c, 0xffffffff, 0x00060005, 327 1.1 riastrad 0x9238, 0xffffffff, 0x00080007, 328 1.1 riastrad 0x923c, 0xffffffff, 0x000a0009, 329 1.1 riastrad 0x9240, 0xffffffff, 0x000c000b, 330 1.1 riastrad 0x9244, 0xffffffff, 0x000e000d, 331 1.1 riastrad 0x9248, 0xffffffff, 0x0010000f, 332 1.1 riastrad 0x9254, 0xffffffff, 0x00120011, 333 1.1 riastrad 0x9258, 0xffffffff, 0x00140013, 334 1.1 riastrad 0x925c, 0xffffffff, 0x00020001, 335 1.1 riastrad 0x9260, 0xffffffff, 0x00040003, 336 1.1 riastrad 0x9264, 0xffffffff, 0x00060005, 337 1.1 riastrad 0x9270, 0xffffffff, 0x00080007, 338 1.1 riastrad 0x9274, 0xffffffff, 0x000a0009, 339 1.1 riastrad 0x9278, 0xffffffff, 0x000c000b, 340 1.1 riastrad 0x927c, 0xffffffff, 0x000e000d, 341 1.1 riastrad 0x9280, 0xffffffff, 0x0010000f, 342 1.1 riastrad 0x928c, 0xffffffff, 0x00120011, 343 1.1 riastrad 0x9290, 0xffffffff, 0x00140013, 344 1.1 riastrad 0x9294, 0xffffffff, 0x00020001, 345 1.1 riastrad 0x929c, 0xffffffff, 0x00040003, 346 1.1 riastrad 0x92a0, 0xffffffff, 0x00060005, 347 1.1 riastrad 0x92a4, 0xffffffff, 0x00080007 348 1.1 riastrad }; 349 1.1 riastrad 350 1.1 riastrad static const u32 rv710_golden_registers[] = 351 1.1 riastrad { 352 1.1 riastrad 0x3f90, 0x00ff0000, 0x00fc0000, 353 1.1 riastrad 0x9148, 0x00ff0000, 0x00fc0000, 354 1.1 riastrad 0x3f94, 0x00ff0000, 0x00fc0000, 355 1.1 riastrad 0x914c, 0x00ff0000, 0x00fc0000, 356 1.1 riastrad 0xb4c, 0x00000020, 0x00000020, 357 1.1 riastrad 0xa180, 0xffffffff, 0x00003f3f 358 1.1 riastrad }; 359 1.1 riastrad 360 1.1 riastrad static const u32 rv710_mgcg_init[] = 361 1.1 riastrad { 362 1.1 riastrad 0x8bcc, 0xffffffff, 0x13030040, 363 1.1 riastrad 0x5448, 0xffffffff, 0x100, 364 1.1 riastrad 0x55e4, 0xffffffff, 0x100, 365 1.1 riastrad 0x160c, 0xffffffff, 0x100, 366 1.1 riastrad 0x5644, 0xffffffff, 0x100, 367 1.1 riastrad 0xc164, 0xffffffff, 0x100, 368 1.1 riastrad 0x8a18, 0xffffffff, 0x100, 369 1.1 riastrad 0x897c, 0xffffffff, 0x8000100, 370 1.1 riastrad 0x8b28, 0xffffffff, 0x3c000100, 371 1.1 riastrad 0x9144, 0xffffffff, 0x100, 372 1.1 riastrad 0x9a1c, 0xffffffff, 0x10000, 373 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 374 1.1 riastrad 0x9a1c, 0xffffffff, 0x0, 375 1.1 riastrad 0x9870, 0xffffffff, 0x100, 376 1.1 riastrad 0x8d58, 0xffffffff, 0x100, 377 1.1 riastrad 0x9500, 0xffffffff, 0x0, 378 1.1 riastrad 0x9510, 0xffffffff, 0x100, 379 1.1 riastrad 0x9500, 0xffffffff, 0x1, 380 1.1 riastrad 0x9510, 0xffffffff, 0x100, 381 1.1 riastrad 0x9500, 0xffffffff, 0x8000, 382 1.1 riastrad 0x9490, 0xffffffff, 0x0, 383 1.1 riastrad 0x949c, 0xffffffff, 0x100, 384 1.1 riastrad 0x9490, 0xffffffff, 0x1, 385 1.1 riastrad 0x949c, 0xffffffff, 0x100, 386 1.1 riastrad 0x9490, 0xffffffff, 0x8000, 387 1.1 riastrad 0x9604, 0xffffffff, 0x0, 388 1.1 riastrad 0x9654, 0xffffffff, 0x100, 389 1.1 riastrad 0x9604, 0xffffffff, 0x1, 390 1.1 riastrad 0x9654, 0xffffffff, 0x100, 391 1.1 riastrad 0x9604, 0xffffffff, 0x80000000, 392 1.1 riastrad 0x9030, 0xffffffff, 0x100, 393 1.1 riastrad 0x9034, 0xffffffff, 0x100, 394 1.1 riastrad 0x9038, 0xffffffff, 0x100, 395 1.1 riastrad 0x903c, 0xffffffff, 0x100, 396 1.1 riastrad 0x9040, 0xffffffff, 0x100, 397 1.1 riastrad 0xa200, 0xffffffff, 0x100, 398 1.1 riastrad 0xa204, 0xffffffff, 0x100, 399 1.1 riastrad 0xa208, 0xffffffff, 0x100, 400 1.1 riastrad 0xa20c, 0xffffffff, 0x100, 401 1.1 riastrad 0x971c, 0xffffffff, 0x100, 402 1.1 riastrad 0x915c, 0xffffffff, 0x00020001, 403 1.1 riastrad 0x9174, 0xffffffff, 0x00000003, 404 1.1 riastrad 0x9178, 0xffffffff, 0x00050001, 405 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 406 1.1 riastrad 0x918c, 0xffffffff, 0x00000004, 407 1.1 riastrad 0x9190, 0xffffffff, 0x00070006, 408 1.1 riastrad 0x9194, 0xffffffff, 0x00050001, 409 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 410 1.1 riastrad 0x91a8, 0xffffffff, 0x00000004, 411 1.1 riastrad 0x91ac, 0xffffffff, 0x00070006, 412 1.1 riastrad 0x91e8, 0xffffffff, 0x00000001, 413 1.1 riastrad 0x9294, 0xffffffff, 0x00000001, 414 1.1 riastrad 0x929c, 0xffffffff, 0x00000002, 415 1.1 riastrad 0x92a0, 0xffffffff, 0x00040003, 416 1.1 riastrad 0x9150, 0xffffffff, 0x4d940000 417 1.1 riastrad }; 418 1.1 riastrad 419 1.1 riastrad static const u32 rv730_golden_registers[] = 420 1.1 riastrad { 421 1.1 riastrad 0x3f90, 0x00ff0000, 0x00f00000, 422 1.1 riastrad 0x9148, 0x00ff0000, 0x00f00000, 423 1.1 riastrad 0x3f94, 0x00ff0000, 0x00f00000, 424 1.1 riastrad 0x914c, 0x00ff0000, 0x00f00000, 425 1.1 riastrad 0x900c, 0xffffffff, 0x003b033f, 426 1.1 riastrad 0xb4c, 0x00000020, 0x00000020, 427 1.1 riastrad 0xa180, 0xffffffff, 0x00003f3f 428 1.1 riastrad }; 429 1.1 riastrad 430 1.1 riastrad static const u32 rv730_mgcg_init[] = 431 1.1 riastrad { 432 1.1 riastrad 0x8bcc, 0xffffffff, 0x130300f9, 433 1.1 riastrad 0x5448, 0xffffffff, 0x100, 434 1.1 riastrad 0x55e4, 0xffffffff, 0x100, 435 1.1 riastrad 0x160c, 0xffffffff, 0x100, 436 1.1 riastrad 0x5644, 0xffffffff, 0x100, 437 1.1 riastrad 0xc164, 0xffffffff, 0x100, 438 1.1 riastrad 0x8a18, 0xffffffff, 0x100, 439 1.1 riastrad 0x897c, 0xffffffff, 0x8000100, 440 1.1 riastrad 0x8b28, 0xffffffff, 0x3c000100, 441 1.1 riastrad 0x9144, 0xffffffff, 0x100, 442 1.1 riastrad 0x9a1c, 0xffffffff, 0x10000, 443 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 444 1.1 riastrad 0x9a1c, 0xffffffff, 0x10001, 445 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 446 1.1 riastrad 0x9a1c, 0xffffffff, 0x0, 447 1.1 riastrad 0x9870, 0xffffffff, 0x100, 448 1.1 riastrad 0x8d58, 0xffffffff, 0x100, 449 1.1 riastrad 0x9500, 0xffffffff, 0x0, 450 1.1 riastrad 0x9510, 0xffffffff, 0x100, 451 1.1 riastrad 0x9500, 0xffffffff, 0x1, 452 1.1 riastrad 0x9510, 0xffffffff, 0x100, 453 1.1 riastrad 0x9500, 0xffffffff, 0x2, 454 1.1 riastrad 0x9510, 0xffffffff, 0x100, 455 1.1 riastrad 0x9500, 0xffffffff, 0x3, 456 1.1 riastrad 0x9510, 0xffffffff, 0x100, 457 1.1 riastrad 0x9500, 0xffffffff, 0x4, 458 1.1 riastrad 0x9510, 0xffffffff, 0x100, 459 1.1 riastrad 0x9500, 0xffffffff, 0x5, 460 1.1 riastrad 0x9510, 0xffffffff, 0x100, 461 1.1 riastrad 0x9500, 0xffffffff, 0x6, 462 1.1 riastrad 0x9510, 0xffffffff, 0x100, 463 1.1 riastrad 0x9500, 0xffffffff, 0x7, 464 1.1 riastrad 0x9510, 0xffffffff, 0x100, 465 1.1 riastrad 0x9500, 0xffffffff, 0x8000, 466 1.1 riastrad 0x9490, 0xffffffff, 0x0, 467 1.1 riastrad 0x949c, 0xffffffff, 0x100, 468 1.1 riastrad 0x9490, 0xffffffff, 0x1, 469 1.1 riastrad 0x949c, 0xffffffff, 0x100, 470 1.1 riastrad 0x9490, 0xffffffff, 0x2, 471 1.1 riastrad 0x949c, 0xffffffff, 0x100, 472 1.1 riastrad 0x9490, 0xffffffff, 0x3, 473 1.1 riastrad 0x949c, 0xffffffff, 0x100, 474 1.1 riastrad 0x9490, 0xffffffff, 0x4, 475 1.1 riastrad 0x949c, 0xffffffff, 0x100, 476 1.1 riastrad 0x9490, 0xffffffff, 0x5, 477 1.1 riastrad 0x949c, 0xffffffff, 0x100, 478 1.1 riastrad 0x9490, 0xffffffff, 0x6, 479 1.1 riastrad 0x949c, 0xffffffff, 0x100, 480 1.1 riastrad 0x9490, 0xffffffff, 0x7, 481 1.1 riastrad 0x949c, 0xffffffff, 0x100, 482 1.1 riastrad 0x9490, 0xffffffff, 0x8000, 483 1.1 riastrad 0x9604, 0xffffffff, 0x0, 484 1.1 riastrad 0x9654, 0xffffffff, 0x100, 485 1.1 riastrad 0x9604, 0xffffffff, 0x1, 486 1.1 riastrad 0x9654, 0xffffffff, 0x100, 487 1.1 riastrad 0x9604, 0xffffffff, 0x2, 488 1.1 riastrad 0x9654, 0xffffffff, 0x100, 489 1.1 riastrad 0x9604, 0xffffffff, 0x3, 490 1.1 riastrad 0x9654, 0xffffffff, 0x100, 491 1.1 riastrad 0x9604, 0xffffffff, 0x4, 492 1.1 riastrad 0x9654, 0xffffffff, 0x100, 493 1.1 riastrad 0x9604, 0xffffffff, 0x5, 494 1.1 riastrad 0x9654, 0xffffffff, 0x100, 495 1.1 riastrad 0x9604, 0xffffffff, 0x6, 496 1.1 riastrad 0x9654, 0xffffffff, 0x100, 497 1.1 riastrad 0x9604, 0xffffffff, 0x7, 498 1.1 riastrad 0x9654, 0xffffffff, 0x100, 499 1.1 riastrad 0x9604, 0xffffffff, 0x80000000, 500 1.1 riastrad 0x9030, 0xffffffff, 0x100, 501 1.1 riastrad 0x9034, 0xffffffff, 0x100, 502 1.1 riastrad 0x9038, 0xffffffff, 0x100, 503 1.1 riastrad 0x903c, 0xffffffff, 0x100, 504 1.1 riastrad 0x9040, 0xffffffff, 0x100, 505 1.1 riastrad 0xa200, 0xffffffff, 0x100, 506 1.1 riastrad 0xa204, 0xffffffff, 0x100, 507 1.1 riastrad 0xa208, 0xffffffff, 0x100, 508 1.1 riastrad 0xa20c, 0xffffffff, 0x100, 509 1.1 riastrad 0x971c, 0xffffffff, 0x100, 510 1.1 riastrad 0x915c, 0xffffffff, 0x00020001, 511 1.1 riastrad 0x916c, 0xffffffff, 0x00040003, 512 1.1 riastrad 0x9170, 0xffffffff, 0x00000005, 513 1.1 riastrad 0x9178, 0xffffffff, 0x00050001, 514 1.1 riastrad 0x917c, 0xffffffff, 0x00030002, 515 1.1 riastrad 0x918c, 0xffffffff, 0x00000004, 516 1.1 riastrad 0x9190, 0xffffffff, 0x00070006, 517 1.1 riastrad 0x9194, 0xffffffff, 0x00050001, 518 1.1 riastrad 0x9198, 0xffffffff, 0x00030002, 519 1.1 riastrad 0x91a8, 0xffffffff, 0x00000004, 520 1.1 riastrad 0x91ac, 0xffffffff, 0x00070006, 521 1.1 riastrad 0x91b0, 0xffffffff, 0x00050001, 522 1.1 riastrad 0x91b4, 0xffffffff, 0x00030002, 523 1.1 riastrad 0x91c4, 0xffffffff, 0x00000004, 524 1.1 riastrad 0x91c8, 0xffffffff, 0x00070006, 525 1.1 riastrad 0x91cc, 0xffffffff, 0x00050001, 526 1.1 riastrad 0x91d0, 0xffffffff, 0x00030002, 527 1.1 riastrad 0x91e0, 0xffffffff, 0x00000004, 528 1.1 riastrad 0x91e4, 0xffffffff, 0x00070006, 529 1.1 riastrad 0x91e8, 0xffffffff, 0x00000001, 530 1.1 riastrad 0x91ec, 0xffffffff, 0x00050001, 531 1.1 riastrad 0x91f0, 0xffffffff, 0x00030002, 532 1.1 riastrad 0x9200, 0xffffffff, 0x00000004, 533 1.1 riastrad 0x9204, 0xffffffff, 0x00070006, 534 1.1 riastrad 0x9208, 0xffffffff, 0x00050001, 535 1.1 riastrad 0x920c, 0xffffffff, 0x00030002, 536 1.1 riastrad 0x921c, 0xffffffff, 0x00000004, 537 1.1 riastrad 0x9220, 0xffffffff, 0x00070006, 538 1.1 riastrad 0x9224, 0xffffffff, 0x00050001, 539 1.1 riastrad 0x9228, 0xffffffff, 0x00030002, 540 1.1 riastrad 0x9238, 0xffffffff, 0x00000004, 541 1.1 riastrad 0x923c, 0xffffffff, 0x00070006, 542 1.1 riastrad 0x9240, 0xffffffff, 0x00050001, 543 1.1 riastrad 0x9244, 0xffffffff, 0x00030002, 544 1.1 riastrad 0x9254, 0xffffffff, 0x00000004, 545 1.1 riastrad 0x9258, 0xffffffff, 0x00070006, 546 1.1 riastrad 0x9294, 0xffffffff, 0x00000001, 547 1.1 riastrad 0x929c, 0xffffffff, 0x00000002, 548 1.1 riastrad 0x92a0, 0xffffffff, 0x00040003, 549 1.1 riastrad 0x92a4, 0xffffffff, 0x00000005 550 1.1 riastrad }; 551 1.1 riastrad 552 1.1 riastrad static const u32 rv740_golden_registers[] = 553 1.1 riastrad { 554 1.1 riastrad 0x88c4, 0xffffffff, 0x00000082, 555 1.1 riastrad 0x28a50, 0xfffffffc, 0x00000004, 556 1.1 riastrad 0x2650, 0x00040000, 0, 557 1.1 riastrad 0x20bc, 0x00040000, 0, 558 1.1 riastrad 0x733c, 0xffffffff, 0x00000002, 559 1.1 riastrad 0x7300, 0xffffffff, 0x001000f0, 560 1.1 riastrad 0x3f90, 0x00ff0000, 0, 561 1.1 riastrad 0x9148, 0x00ff0000, 0, 562 1.1 riastrad 0x3f94, 0x00ff0000, 0, 563 1.1 riastrad 0x914c, 0x00ff0000, 0, 564 1.1 riastrad 0x240c, 0xffffffff, 0x00000380, 565 1.1 riastrad 0x8a14, 0x00000007, 0x00000007, 566 1.1 riastrad 0x8b24, 0xffffffff, 0x00ff0fff, 567 1.1 riastrad 0x28a4c, 0xffffffff, 0x00004000, 568 1.1 riastrad 0xa180, 0xffffffff, 0x00003f3f, 569 1.1 riastrad 0x8d00, 0xffffffff, 0x0e0e003a, 570 1.1 riastrad 0x8d04, 0xffffffff, 0x013a0e2a, 571 1.1 riastrad 0x8c00, 0xffffffff, 0xe400000f, 572 1.1 riastrad 0x8db0, 0xffffffff, 0x98989898, 573 1.1 riastrad 0x8db4, 0xffffffff, 0x98989898, 574 1.1 riastrad 0x8db8, 0xffffffff, 0x98989898, 575 1.1 riastrad 0x8dbc, 0xffffffff, 0x98989898, 576 1.1 riastrad 0x8dc0, 0xffffffff, 0x98989898, 577 1.1 riastrad 0x8dc4, 0xffffffff, 0x98989898, 578 1.1 riastrad 0x8dc8, 0xffffffff, 0x98989898, 579 1.1 riastrad 0x8dcc, 0xffffffff, 0x98989898, 580 1.1 riastrad 0x9058, 0xffffffff, 0x0fffc40f, 581 1.1 riastrad 0x900c, 0xffffffff, 0x003b033f, 582 1.1 riastrad 0x28350, 0xffffffff, 0, 583 1.1 riastrad 0x8cf0, 0x1fffffff, 0x08e00420, 584 1.1 riastrad 0x9508, 0xffffffff, 0x00000002, 585 1.1 riastrad 0x88c4, 0xffffffff, 0x000000c2, 586 1.1 riastrad 0x9698, 0x18000000, 0x18000000 587 1.1 riastrad }; 588 1.1 riastrad 589 1.1 riastrad static const u32 rv740_mgcg_init[] = 590 1.1 riastrad { 591 1.1 riastrad 0x8bcc, 0xffffffff, 0x13030100, 592 1.1 riastrad 0x5448, 0xffffffff, 0x100, 593 1.1 riastrad 0x55e4, 0xffffffff, 0x100, 594 1.1 riastrad 0x160c, 0xffffffff, 0x100, 595 1.1 riastrad 0x5644, 0xffffffff, 0x100, 596 1.1 riastrad 0xc164, 0xffffffff, 0x100, 597 1.1 riastrad 0x8a18, 0xffffffff, 0x100, 598 1.1 riastrad 0x897c, 0xffffffff, 0x100, 599 1.1 riastrad 0x8b28, 0xffffffff, 0x100, 600 1.1 riastrad 0x9144, 0xffffffff, 0x100, 601 1.1 riastrad 0x9a1c, 0xffffffff, 0x10000, 602 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 603 1.1 riastrad 0x9a1c, 0xffffffff, 0x10001, 604 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 605 1.1 riastrad 0x9a1c, 0xffffffff, 0x10002, 606 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 607 1.1 riastrad 0x9a1c, 0xffffffff, 0x10003, 608 1.1 riastrad 0x9a50, 0xffffffff, 0x100, 609 1.1 riastrad 0x9a1c, 0xffffffff, 0x0, 610 1.1 riastrad 0x9870, 0xffffffff, 0x100, 611 1.1 riastrad 0x8d58, 0xffffffff, 0x100, 612 1.1 riastrad 0x9500, 0xffffffff, 0x0, 613 1.1 riastrad 0x9510, 0xffffffff, 0x100, 614 1.1 riastrad 0x9500, 0xffffffff, 0x1, 615 1.1 riastrad 0x9510, 0xffffffff, 0x100, 616 1.1 riastrad 0x9500, 0xffffffff, 0x2, 617 1.1 riastrad 0x9510, 0xffffffff, 0x100, 618 1.1 riastrad 0x9500, 0xffffffff, 0x3, 619 1.1 riastrad 0x9510, 0xffffffff, 0x100, 620 1.1 riastrad 0x9500, 0xffffffff, 0x4, 621 1.1 riastrad 0x9510, 0xffffffff, 0x100, 622 1.1 riastrad 0x9500, 0xffffffff, 0x5, 623 1.1 riastrad 0x9510, 0xffffffff, 0x100, 624 1.1 riastrad 0x9500, 0xffffffff, 0x6, 625 1.1 riastrad 0x9510, 0xffffffff, 0x100, 626 1.1 riastrad 0x9500, 0xffffffff, 0x7, 627 1.1 riastrad 0x9510, 0xffffffff, 0x100, 628 1.1 riastrad 0x9500, 0xffffffff, 0x8000, 629 1.1 riastrad 0x9490, 0xffffffff, 0x0, 630 1.1 riastrad 0x949c, 0xffffffff, 0x100, 631 1.1 riastrad 0x9490, 0xffffffff, 0x1, 632 1.1 riastrad 0x949c, 0xffffffff, 0x100, 633 1.1 riastrad 0x9490, 0xffffffff, 0x2, 634 1.1 riastrad 0x949c, 0xffffffff, 0x100, 635 1.1 riastrad 0x9490, 0xffffffff, 0x3, 636 1.1 riastrad 0x949c, 0xffffffff, 0x100, 637 1.1 riastrad 0x9490, 0xffffffff, 0x4, 638 1.1 riastrad 0x949c, 0xffffffff, 0x100, 639 1.1 riastrad 0x9490, 0xffffffff, 0x5, 640 1.1 riastrad 0x949c, 0xffffffff, 0x100, 641 1.1 riastrad 0x9490, 0xffffffff, 0x6, 642 1.1 riastrad 0x949c, 0xffffffff, 0x100, 643 1.1 riastrad 0x9490, 0xffffffff, 0x7, 644 1.1 riastrad 0x949c, 0xffffffff, 0x100, 645 1.1 riastrad 0x9490, 0xffffffff, 0x8000, 646 1.1 riastrad 0x9604, 0xffffffff, 0x0, 647 1.1 riastrad 0x9654, 0xffffffff, 0x100, 648 1.1 riastrad 0x9604, 0xffffffff, 0x1, 649 1.1 riastrad 0x9654, 0xffffffff, 0x100, 650 1.1 riastrad 0x9604, 0xffffffff, 0x2, 651 1.1 riastrad 0x9654, 0xffffffff, 0x100, 652 1.1 riastrad 0x9604, 0xffffffff, 0x3, 653 1.1 riastrad 0x9654, 0xffffffff, 0x100, 654 1.1 riastrad 0x9604, 0xffffffff, 0x4, 655 1.1 riastrad 0x9654, 0xffffffff, 0x100, 656 1.1 riastrad 0x9604, 0xffffffff, 0x5, 657 1.1 riastrad 0x9654, 0xffffffff, 0x100, 658 1.1 riastrad 0x9604, 0xffffffff, 0x6, 659 1.1 riastrad 0x9654, 0xffffffff, 0x100, 660 1.1 riastrad 0x9604, 0xffffffff, 0x7, 661 1.1 riastrad 0x9654, 0xffffffff, 0x100, 662 1.1 riastrad 0x9604, 0xffffffff, 0x80000000, 663 1.1 riastrad 0x9030, 0xffffffff, 0x100, 664 1.1 riastrad 0x9034, 0xffffffff, 0x100, 665 1.1 riastrad 0x9038, 0xffffffff, 0x100, 666 1.1 riastrad 0x903c, 0xffffffff, 0x100, 667 1.1 riastrad 0x9040, 0xffffffff, 0x100, 668 1.1 riastrad 0xa200, 0xffffffff, 0x100, 669 1.1 riastrad 0xa204, 0xffffffff, 0x100, 670 1.1 riastrad 0xa208, 0xffffffff, 0x100, 671 1.1 riastrad 0xa20c, 0xffffffff, 0x100, 672 1.1 riastrad 0x971c, 0xffffffff, 0x100, 673 1.1 riastrad 0x915c, 0xffffffff, 0x00020001, 674 1.1 riastrad 0x9160, 0xffffffff, 0x00040003, 675 1.1 riastrad 0x916c, 0xffffffff, 0x00060005, 676 1.1 riastrad 0x9170, 0xffffffff, 0x00080007, 677 1.1 riastrad 0x9174, 0xffffffff, 0x000a0009, 678 1.1 riastrad 0x9178, 0xffffffff, 0x000c000b, 679 1.1 riastrad 0x917c, 0xffffffff, 0x000e000d, 680 1.1 riastrad 0x9180, 0xffffffff, 0x0010000f, 681 1.1 riastrad 0x918c, 0xffffffff, 0x00120011, 682 1.1 riastrad 0x9190, 0xffffffff, 0x00140013, 683 1.1 riastrad 0x9194, 0xffffffff, 0x00020001, 684 1.1 riastrad 0x9198, 0xffffffff, 0x00040003, 685 1.1 riastrad 0x919c, 0xffffffff, 0x00060005, 686 1.1 riastrad 0x91a8, 0xffffffff, 0x00080007, 687 1.1 riastrad 0x91ac, 0xffffffff, 0x000a0009, 688 1.1 riastrad 0x91b0, 0xffffffff, 0x000c000b, 689 1.1 riastrad 0x91b4, 0xffffffff, 0x000e000d, 690 1.1 riastrad 0x91b8, 0xffffffff, 0x0010000f, 691 1.1 riastrad 0x91c4, 0xffffffff, 0x00120011, 692 1.1 riastrad 0x91c8, 0xffffffff, 0x00140013, 693 1.1 riastrad 0x91cc, 0xffffffff, 0x00020001, 694 1.1 riastrad 0x91d0, 0xffffffff, 0x00040003, 695 1.1 riastrad 0x91d4, 0xffffffff, 0x00060005, 696 1.1 riastrad 0x91e0, 0xffffffff, 0x00080007, 697 1.1 riastrad 0x91e4, 0xffffffff, 0x000a0009, 698 1.1 riastrad 0x91e8, 0xffffffff, 0x000c000b, 699 1.1 riastrad 0x91ec, 0xffffffff, 0x00020001, 700 1.1 riastrad 0x91f0, 0xffffffff, 0x00040003, 701 1.1 riastrad 0x91f4, 0xffffffff, 0x00060005, 702 1.1 riastrad 0x9200, 0xffffffff, 0x00080007, 703 1.1 riastrad 0x9204, 0xffffffff, 0x000a0009, 704 1.1 riastrad 0x9208, 0xffffffff, 0x000c000b, 705 1.1 riastrad 0x920c, 0xffffffff, 0x000e000d, 706 1.1 riastrad 0x9210, 0xffffffff, 0x0010000f, 707 1.1 riastrad 0x921c, 0xffffffff, 0x00120011, 708 1.1 riastrad 0x9220, 0xffffffff, 0x00140013, 709 1.1 riastrad 0x9224, 0xffffffff, 0x00020001, 710 1.1 riastrad 0x9228, 0xffffffff, 0x00040003, 711 1.1 riastrad 0x922c, 0xffffffff, 0x00060005, 712 1.1 riastrad 0x9238, 0xffffffff, 0x00080007, 713 1.1 riastrad 0x923c, 0xffffffff, 0x000a0009, 714 1.1 riastrad 0x9240, 0xffffffff, 0x000c000b, 715 1.1 riastrad 0x9244, 0xffffffff, 0x000e000d, 716 1.1 riastrad 0x9248, 0xffffffff, 0x0010000f, 717 1.1 riastrad 0x9254, 0xffffffff, 0x00120011, 718 1.1 riastrad 0x9258, 0xffffffff, 0x00140013, 719 1.1 riastrad 0x9294, 0xffffffff, 0x00020001, 720 1.1 riastrad 0x929c, 0xffffffff, 0x00040003, 721 1.1 riastrad 0x92a0, 0xffffffff, 0x00060005, 722 1.1 riastrad 0x92a4, 0xffffffff, 0x00080007 723 1.1 riastrad }; 724 1.1 riastrad 725 1.1 riastrad static void rv770_init_golden_registers(struct radeon_device *rdev) 726 1.1 riastrad { 727 1.1 riastrad switch (rdev->family) { 728 1.1 riastrad case CHIP_RV770: 729 1.1 riastrad radeon_program_register_sequence(rdev, 730 1.1 riastrad r7xx_golden_registers, 731 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_registers)); 732 1.1 riastrad radeon_program_register_sequence(rdev, 733 1.1 riastrad r7xx_golden_dyn_gpr_registers, 734 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 735 1.1 riastrad if (rdev->pdev->device == 0x994e) 736 1.1 riastrad radeon_program_register_sequence(rdev, 737 1.1 riastrad rv770ce_golden_registers, 738 1.1 riastrad (const u32)ARRAY_SIZE(rv770ce_golden_registers)); 739 1.1 riastrad else 740 1.1 riastrad radeon_program_register_sequence(rdev, 741 1.1 riastrad rv770_golden_registers, 742 1.1 riastrad (const u32)ARRAY_SIZE(rv770_golden_registers)); 743 1.1 riastrad radeon_program_register_sequence(rdev, 744 1.1 riastrad rv770_mgcg_init, 745 1.1 riastrad (const u32)ARRAY_SIZE(rv770_mgcg_init)); 746 1.1 riastrad break; 747 1.1 riastrad case CHIP_RV730: 748 1.1 riastrad radeon_program_register_sequence(rdev, 749 1.1 riastrad r7xx_golden_registers, 750 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_registers)); 751 1.1 riastrad radeon_program_register_sequence(rdev, 752 1.1 riastrad r7xx_golden_dyn_gpr_registers, 753 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 754 1.1 riastrad radeon_program_register_sequence(rdev, 755 1.1 riastrad rv730_golden_registers, 756 1.1 riastrad (const u32)ARRAY_SIZE(rv730_golden_registers)); 757 1.1 riastrad radeon_program_register_sequence(rdev, 758 1.1 riastrad rv730_mgcg_init, 759 1.1 riastrad (const u32)ARRAY_SIZE(rv730_mgcg_init)); 760 1.1 riastrad break; 761 1.1 riastrad case CHIP_RV710: 762 1.1 riastrad radeon_program_register_sequence(rdev, 763 1.1 riastrad r7xx_golden_registers, 764 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_registers)); 765 1.1 riastrad radeon_program_register_sequence(rdev, 766 1.1 riastrad r7xx_golden_dyn_gpr_registers, 767 1.1 riastrad (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 768 1.1 riastrad radeon_program_register_sequence(rdev, 769 1.1 riastrad rv710_golden_registers, 770 1.1 riastrad (const u32)ARRAY_SIZE(rv710_golden_registers)); 771 1.1 riastrad radeon_program_register_sequence(rdev, 772 1.1 riastrad rv710_mgcg_init, 773 1.1 riastrad (const u32)ARRAY_SIZE(rv710_mgcg_init)); 774 1.1 riastrad break; 775 1.1 riastrad case CHIP_RV740: 776 1.1 riastrad radeon_program_register_sequence(rdev, 777 1.1 riastrad rv740_golden_registers, 778 1.1 riastrad (const u32)ARRAY_SIZE(rv740_golden_registers)); 779 1.1 riastrad radeon_program_register_sequence(rdev, 780 1.1 riastrad rv740_mgcg_init, 781 1.1 riastrad (const u32)ARRAY_SIZE(rv740_mgcg_init)); 782 1.1 riastrad break; 783 1.1 riastrad default: 784 1.1 riastrad break; 785 1.1 riastrad } 786 1.1 riastrad } 787 1.1 riastrad 788 1.1 riastrad #define PCIE_BUS_CLK 10000 789 1.1 riastrad #define TCLK (PCIE_BUS_CLK / 10) 790 1.1 riastrad 791 1.1 riastrad /** 792 1.1 riastrad * rv770_get_xclk - get the xclk 793 1.1 riastrad * 794 1.1 riastrad * @rdev: radeon_device pointer 795 1.1 riastrad * 796 1.1 riastrad * Returns the reference clock used by the gfx engine 797 1.1 riastrad * (r7xx-cayman). 798 1.1 riastrad */ 799 1.1 riastrad u32 rv770_get_xclk(struct radeon_device *rdev) 800 1.1 riastrad { 801 1.1 riastrad u32 reference_clock = rdev->clock.spll.reference_freq; 802 1.1 riastrad u32 tmp = RREG32(CG_CLKPIN_CNTL); 803 1.1 riastrad 804 1.1 riastrad if (tmp & MUX_TCLK_TO_XCLK) 805 1.1 riastrad return TCLK; 806 1.1 riastrad 807 1.1 riastrad if (tmp & XTALIN_DIVIDE) 808 1.1 riastrad return reference_clock / 4; 809 1.1 riastrad 810 1.1 riastrad return reference_clock; 811 1.1 riastrad } 812 1.1 riastrad 813 1.2 riastrad void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async) 814 1.1 riastrad { 815 1.1 riastrad struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 816 1.1 riastrad u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset); 817 1.1 riastrad int i; 818 1.1 riastrad 819 1.1 riastrad /* Lock the graphics update lock */ 820 1.1 riastrad tmp |= AVIVO_D1GRPH_UPDATE_LOCK; 821 1.1 riastrad WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 822 1.1 riastrad 823 1.1 riastrad /* update the scanout addresses */ 824 1.2 riastrad WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 825 1.2 riastrad async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0); 826 1.1 riastrad if (radeon_crtc->crtc_id) { 827 1.1 riastrad WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 828 1.1 riastrad WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 829 1.1 riastrad } else { 830 1.1 riastrad WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 831 1.1 riastrad WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 832 1.1 riastrad } 833 1.1 riastrad WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 834 1.1 riastrad (u32)crtc_base); 835 1.1 riastrad WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 836 1.1 riastrad (u32)crtc_base); 837 1.1 riastrad 838 1.1 riastrad /* Wait for update_pending to go high. */ 839 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 840 1.1 riastrad if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING) 841 1.1 riastrad break; 842 1.1 riastrad udelay(1); 843 1.1 riastrad } 844 1.1 riastrad DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n"); 845 1.1 riastrad 846 1.1 riastrad /* Unlock the lock, so double-buffering can take place inside vblank */ 847 1.1 riastrad tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK; 848 1.1 riastrad WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 849 1.1 riastrad } 850 1.1 riastrad 851 1.1 riastrad bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id) 852 1.1 riastrad { 853 1.1 riastrad struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 854 1.1 riastrad 855 1.1 riastrad /* Return current update_pending status: */ 856 1.1 riastrad return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & 857 1.1 riastrad AVIVO_D1GRPH_SURFACE_UPDATE_PENDING); 858 1.1 riastrad } 859 1.1 riastrad 860 1.1 riastrad /* get temperature in millidegrees */ 861 1.1 riastrad int rv770_get_temp(struct radeon_device *rdev) 862 1.1 riastrad { 863 1.1 riastrad u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> 864 1.1 riastrad ASIC_T_SHIFT; 865 1.1 riastrad int actual_temp; 866 1.1 riastrad 867 1.1 riastrad if (temp & 0x400) 868 1.1 riastrad actual_temp = -256; 869 1.1 riastrad else if (temp & 0x200) 870 1.1 riastrad actual_temp = 255; 871 1.1 riastrad else if (temp & 0x100) { 872 1.1 riastrad actual_temp = temp & 0x1ff; 873 1.1 riastrad actual_temp |= ~0x1ff; 874 1.1 riastrad } else 875 1.1 riastrad actual_temp = temp & 0xff; 876 1.1 riastrad 877 1.1 riastrad return (actual_temp * 1000) / 2; 878 1.1 riastrad } 879 1.1 riastrad 880 1.1 riastrad void rv770_pm_misc(struct radeon_device *rdev) 881 1.1 riastrad { 882 1.1 riastrad int req_ps_idx = rdev->pm.requested_power_state_index; 883 1.1 riastrad int req_cm_idx = rdev->pm.requested_clock_mode_index; 884 1.1 riastrad struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; 885 1.1 riastrad struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 886 1.1 riastrad 887 1.1 riastrad if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 888 1.1 riastrad /* 0xff01 is a flag rather then an actual voltage */ 889 1.1 riastrad if (voltage->voltage == 0xff01) 890 1.1 riastrad return; 891 1.1 riastrad if (voltage->voltage != rdev->pm.current_vddc) { 892 1.1 riastrad radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); 893 1.1 riastrad rdev->pm.current_vddc = voltage->voltage; 894 1.1 riastrad DRM_DEBUG("Setting: v: %d\n", voltage->voltage); 895 1.1 riastrad } 896 1.1 riastrad } 897 1.1 riastrad } 898 1.1 riastrad 899 1.1 riastrad /* 900 1.1 riastrad * GART 901 1.1 riastrad */ 902 1.1 riastrad static int rv770_pcie_gart_enable(struct radeon_device *rdev) 903 1.1 riastrad { 904 1.1 riastrad u32 tmp; 905 1.1 riastrad int r, i; 906 1.1 riastrad 907 1.1 riastrad if (rdev->gart.robj == NULL) { 908 1.1 riastrad dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 909 1.1 riastrad return -EINVAL; 910 1.1 riastrad } 911 1.1 riastrad r = radeon_gart_table_vram_pin(rdev); 912 1.1 riastrad if (r) 913 1.1 riastrad return r; 914 1.1 riastrad /* Setup L2 cache */ 915 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 916 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 917 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 918 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 919 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 920 1.1 riastrad /* Setup TLB control */ 921 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 922 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 923 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 924 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 925 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 926 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 927 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 928 1.1 riastrad if (rdev->family == CHIP_RV740) 929 1.1 riastrad WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); 930 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 931 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 932 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 933 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 934 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 935 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 936 1.1 riastrad WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 937 1.1 riastrad WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 938 1.1 riastrad RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 939 1.1 riastrad WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 940 1.1 riastrad (u32)(rdev->dummy_page.addr >> 12)); 941 1.1 riastrad for (i = 1; i < 7; i++) 942 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 943 1.1 riastrad 944 1.1 riastrad r600_pcie_gart_tlb_flush(rdev); 945 1.1 riastrad DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 946 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20), 947 1.1 riastrad (unsigned long long)rdev->gart.table_addr); 948 1.1 riastrad rdev->gart.ready = true; 949 1.1 riastrad return 0; 950 1.1 riastrad } 951 1.1 riastrad 952 1.1 riastrad static void rv770_pcie_gart_disable(struct radeon_device *rdev) 953 1.1 riastrad { 954 1.1 riastrad u32 tmp; 955 1.1 riastrad int i; 956 1.1 riastrad 957 1.1 riastrad /* Disable all tables */ 958 1.1 riastrad for (i = 0; i < 7; i++) 959 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 960 1.1 riastrad 961 1.1 riastrad /* Setup L2 cache */ 962 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING | 963 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 964 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 965 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 966 1.1 riastrad /* Setup TLB control */ 967 1.1 riastrad tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 968 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 969 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 970 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 971 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 972 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 973 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 974 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 975 1.1 riastrad radeon_gart_table_vram_unpin(rdev); 976 1.1 riastrad } 977 1.1 riastrad 978 1.1 riastrad static void rv770_pcie_gart_fini(struct radeon_device *rdev) 979 1.1 riastrad { 980 1.1 riastrad radeon_gart_fini(rdev); 981 1.1 riastrad rv770_pcie_gart_disable(rdev); 982 1.1 riastrad radeon_gart_table_vram_free(rdev); 983 1.1 riastrad } 984 1.1 riastrad 985 1.1 riastrad 986 1.1 riastrad static void rv770_agp_enable(struct radeon_device *rdev) 987 1.1 riastrad { 988 1.1 riastrad u32 tmp; 989 1.1 riastrad int i; 990 1.1 riastrad 991 1.1 riastrad /* Setup L2 cache */ 992 1.1 riastrad WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 993 1.1 riastrad ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 994 1.1 riastrad EFFECTIVE_L2_QUEUE_SIZE(7)); 995 1.1 riastrad WREG32(VM_L2_CNTL2, 0); 996 1.1 riastrad WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 997 1.1 riastrad /* Setup TLB control */ 998 1.1 riastrad tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 999 1.1 riastrad SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1000 1.1 riastrad SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 1001 1.1 riastrad EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 1002 1.1 riastrad WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 1003 1.1 riastrad WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 1004 1.1 riastrad WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 1005 1.1 riastrad WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 1006 1.1 riastrad WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 1007 1.1 riastrad WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 1008 1.1 riastrad WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 1009 1.1 riastrad for (i = 0; i < 7; i++) 1010 1.1 riastrad WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 1011 1.1 riastrad } 1012 1.1 riastrad 1013 1.1 riastrad static void rv770_mc_program(struct radeon_device *rdev) 1014 1.1 riastrad { 1015 1.1 riastrad struct rv515_mc_save save; 1016 1.1 riastrad u32 tmp; 1017 1.1 riastrad int i, j; 1018 1.1 riastrad 1019 1.1 riastrad /* Initialize HDP */ 1020 1.1 riastrad for (i = 0, j = 0; i < 32; i++, j += 0x18) { 1021 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 1022 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 1023 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 1024 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 1025 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 1026 1.1 riastrad } 1027 1.1 riastrad /* r7xx hw bug. Read from HDP_DEBUG1 rather 1028 1.1 riastrad * than writing to HDP_REG_COHERENCY_FLUSH_CNTL 1029 1.1 riastrad */ 1030 1.1 riastrad tmp = RREG32(HDP_DEBUG1); 1031 1.1 riastrad 1032 1.1 riastrad rv515_mc_stop(rdev, &save); 1033 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1034 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1035 1.1 riastrad } 1036 1.1 riastrad /* Lockout access through VGA aperture*/ 1037 1.1 riastrad WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); 1038 1.1 riastrad /* Update configuration */ 1039 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1040 1.1 riastrad if (rdev->mc.vram_start < rdev->mc.gtt_start) { 1041 1.1 riastrad /* VRAM before AGP */ 1042 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 1043 1.1 riastrad rdev->mc.vram_start >> 12); 1044 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 1045 1.1 riastrad rdev->mc.gtt_end >> 12); 1046 1.1 riastrad } else { 1047 1.1 riastrad /* VRAM after AGP */ 1048 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 1049 1.1 riastrad rdev->mc.gtt_start >> 12); 1050 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 1051 1.1 riastrad rdev->mc.vram_end >> 12); 1052 1.1 riastrad } 1053 1.1 riastrad } else { 1054 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 1055 1.1 riastrad rdev->mc.vram_start >> 12); 1056 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 1057 1.1 riastrad rdev->mc.vram_end >> 12); 1058 1.1 riastrad } 1059 1.1 riastrad WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); 1060 1.1 riastrad tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; 1061 1.1 riastrad tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 1062 1.1 riastrad WREG32(MC_VM_FB_LOCATION, tmp); 1063 1.1 riastrad WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 1064 1.1 riastrad WREG32(HDP_NONSURFACE_INFO, (2 << 7)); 1065 1.1 riastrad WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 1066 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1067 1.1 riastrad WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); 1068 1.1 riastrad WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); 1069 1.1 riastrad WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); 1070 1.1 riastrad } else { 1071 1.1 riastrad WREG32(MC_VM_AGP_BASE, 0); 1072 1.1 riastrad WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); 1073 1.1 riastrad WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); 1074 1.1 riastrad } 1075 1.1 riastrad if (r600_mc_wait_for_idle(rdev)) { 1076 1.1 riastrad dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1077 1.1 riastrad } 1078 1.1 riastrad rv515_mc_resume(rdev, &save); 1079 1.1 riastrad /* we need to own VRAM, so turn off the VGA renderer here 1080 1.1 riastrad * to stop it overwriting our objects */ 1081 1.1 riastrad rv515_vga_render_disable(rdev); 1082 1.1 riastrad } 1083 1.1 riastrad 1084 1.1 riastrad 1085 1.1 riastrad /* 1086 1.1 riastrad * CP. 1087 1.1 riastrad */ 1088 1.1 riastrad void r700_cp_stop(struct radeon_device *rdev) 1089 1.1 riastrad { 1090 1.1 riastrad if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 1091 1.1 riastrad radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 1092 1.1 riastrad WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 1093 1.1 riastrad WREG32(SCRATCH_UMSK, 0); 1094 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1095 1.1 riastrad } 1096 1.1 riastrad 1097 1.1 riastrad static int rv770_cp_load_microcode(struct radeon_device *rdev) 1098 1.1 riastrad { 1099 1.1 riastrad const __be32 *fw_data; 1100 1.1 riastrad int i; 1101 1.1 riastrad 1102 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw) 1103 1.1 riastrad return -EINVAL; 1104 1.1 riastrad 1105 1.1 riastrad r700_cp_stop(rdev); 1106 1.1 riastrad WREG32(CP_RB_CNTL, 1107 1.1 riastrad #ifdef __BIG_ENDIAN 1108 1.1 riastrad BUF_SWAP_32BIT | 1109 1.1 riastrad #endif 1110 1.1 riastrad RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); 1111 1.1 riastrad 1112 1.1 riastrad /* Reset cp */ 1113 1.1 riastrad WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 1114 1.1 riastrad RREG32(GRBM_SOFT_RESET); 1115 1.1 riastrad mdelay(15); 1116 1.1 riastrad WREG32(GRBM_SOFT_RESET, 0); 1117 1.1 riastrad 1118 1.1 riastrad fw_data = (const __be32 *)rdev->pfp_fw->data; 1119 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1120 1.1 riastrad for (i = 0; i < R700_PFP_UCODE_SIZE; i++) 1121 1.1 riastrad WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 1122 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1123 1.1 riastrad 1124 1.1 riastrad fw_data = (const __be32 *)rdev->me_fw->data; 1125 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 1126 1.1 riastrad for (i = 0; i < R700_PM4_UCODE_SIZE; i++) 1127 1.1 riastrad WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 1128 1.1 riastrad 1129 1.1 riastrad WREG32(CP_PFP_UCODE_ADDR, 0); 1130 1.1 riastrad WREG32(CP_ME_RAM_WADDR, 0); 1131 1.1 riastrad WREG32(CP_ME_RAM_RADDR, 0); 1132 1.1 riastrad return 0; 1133 1.1 riastrad } 1134 1.1 riastrad 1135 1.1 riastrad void r700_cp_fini(struct radeon_device *rdev) 1136 1.1 riastrad { 1137 1.1 riastrad struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1138 1.1 riastrad r700_cp_stop(rdev); 1139 1.1 riastrad radeon_ring_fini(rdev, ring); 1140 1.1 riastrad radeon_scratch_free(rdev, ring->rptr_save_reg); 1141 1.1 riastrad } 1142 1.1 riastrad 1143 1.1 riastrad void rv770_set_clk_bypass_mode(struct radeon_device *rdev) 1144 1.1 riastrad { 1145 1.1 riastrad u32 tmp, i; 1146 1.1 riastrad 1147 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 1148 1.1 riastrad return; 1149 1.1 riastrad 1150 1.1 riastrad tmp = RREG32(CG_SPLL_FUNC_CNTL_2); 1151 1.1 riastrad tmp &= SCLK_MUX_SEL_MASK; 1152 1.1 riastrad tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE; 1153 1.1 riastrad WREG32(CG_SPLL_FUNC_CNTL_2, tmp); 1154 1.1 riastrad 1155 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 1156 1.1 riastrad if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS) 1157 1.1 riastrad break; 1158 1.1 riastrad udelay(1); 1159 1.1 riastrad } 1160 1.1 riastrad 1161 1.1 riastrad tmp &= ~SCLK_MUX_UPDATE; 1162 1.1 riastrad WREG32(CG_SPLL_FUNC_CNTL_2, tmp); 1163 1.1 riastrad 1164 1.1 riastrad tmp = RREG32(MPLL_CNTL_MODE); 1165 1.1 riastrad if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) 1166 1.1 riastrad tmp &= ~RV730_MPLL_MCLK_SEL; 1167 1.1 riastrad else 1168 1.1 riastrad tmp &= ~MPLL_MCLK_SEL; 1169 1.1 riastrad WREG32(MPLL_CNTL_MODE, tmp); 1170 1.1 riastrad } 1171 1.1 riastrad 1172 1.1 riastrad /* 1173 1.1 riastrad * Core functions 1174 1.1 riastrad */ 1175 1.1 riastrad static void rv770_gpu_init(struct radeon_device *rdev) 1176 1.1 riastrad { 1177 1.1 riastrad int i, j, num_qd_pipes; 1178 1.1 riastrad u32 ta_aux_cntl; 1179 1.1 riastrad u32 sx_debug_1; 1180 1.1 riastrad u32 smx_dc_ctl0; 1181 1.1 riastrad u32 db_debug3; 1182 1.1 riastrad u32 num_gs_verts_per_thread; 1183 1.1 riastrad u32 vgt_gs_per_es; 1184 1.1 riastrad u32 gs_prim_buffer_depth = 0; 1185 1.1 riastrad u32 sq_ms_fifo_sizes; 1186 1.1 riastrad u32 sq_config; 1187 1.1 riastrad u32 sq_thread_resource_mgmt; 1188 1.1 riastrad u32 hdp_host_path_cntl; 1189 1.1 riastrad u32 sq_dyn_gpr_size_simd_ab_0; 1190 1.1 riastrad u32 gb_tiling_config = 0; 1191 1.1 riastrad u32 cc_gc_shader_pipe_config = 0; 1192 1.1 riastrad u32 mc_arb_ramcfg; 1193 1.1 riastrad u32 db_debug4, tmp; 1194 1.1 riastrad u32 inactive_pipes, shader_pipe_config; 1195 1.1 riastrad u32 disabled_rb_mask; 1196 1.1 riastrad unsigned active_number; 1197 1.1 riastrad 1198 1.1 riastrad /* setup chip specs */ 1199 1.1 riastrad rdev->config.rv770.tiling_group_size = 256; 1200 1.1 riastrad switch (rdev->family) { 1201 1.1 riastrad case CHIP_RV770: 1202 1.1 riastrad rdev->config.rv770.max_pipes = 4; 1203 1.1 riastrad rdev->config.rv770.max_tile_pipes = 8; 1204 1.1 riastrad rdev->config.rv770.max_simds = 10; 1205 1.1 riastrad rdev->config.rv770.max_backends = 4; 1206 1.1 riastrad rdev->config.rv770.max_gprs = 256; 1207 1.1 riastrad rdev->config.rv770.max_threads = 248; 1208 1.1 riastrad rdev->config.rv770.max_stack_entries = 512; 1209 1.1 riastrad rdev->config.rv770.max_hw_contexts = 8; 1210 1.1 riastrad rdev->config.rv770.max_gs_threads = 16 * 2; 1211 1.1 riastrad rdev->config.rv770.sx_max_export_size = 128; 1212 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size = 16; 1213 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size = 112; 1214 1.1 riastrad rdev->config.rv770.sq_num_cf_insts = 2; 1215 1.1 riastrad 1216 1.1 riastrad rdev->config.rv770.sx_num_of_sets = 7; 1217 1.1 riastrad rdev->config.rv770.sc_prim_fifo_size = 0xF9; 1218 1.1 riastrad rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 1219 1.1 riastrad rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 1220 1.1 riastrad break; 1221 1.1 riastrad case CHIP_RV730: 1222 1.1 riastrad rdev->config.rv770.max_pipes = 2; 1223 1.1 riastrad rdev->config.rv770.max_tile_pipes = 4; 1224 1.1 riastrad rdev->config.rv770.max_simds = 8; 1225 1.1 riastrad rdev->config.rv770.max_backends = 2; 1226 1.1 riastrad rdev->config.rv770.max_gprs = 128; 1227 1.1 riastrad rdev->config.rv770.max_threads = 248; 1228 1.1 riastrad rdev->config.rv770.max_stack_entries = 256; 1229 1.1 riastrad rdev->config.rv770.max_hw_contexts = 8; 1230 1.1 riastrad rdev->config.rv770.max_gs_threads = 16 * 2; 1231 1.1 riastrad rdev->config.rv770.sx_max_export_size = 256; 1232 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size = 32; 1233 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size = 224; 1234 1.1 riastrad rdev->config.rv770.sq_num_cf_insts = 2; 1235 1.1 riastrad 1236 1.1 riastrad rdev->config.rv770.sx_num_of_sets = 7; 1237 1.1 riastrad rdev->config.rv770.sc_prim_fifo_size = 0xf9; 1238 1.1 riastrad rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 1239 1.1 riastrad rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 1240 1.1 riastrad if (rdev->config.rv770.sx_max_export_pos_size > 16) { 1241 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size -= 16; 1242 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size += 16; 1243 1.1 riastrad } 1244 1.1 riastrad break; 1245 1.1 riastrad case CHIP_RV710: 1246 1.1 riastrad rdev->config.rv770.max_pipes = 2; 1247 1.1 riastrad rdev->config.rv770.max_tile_pipes = 2; 1248 1.1 riastrad rdev->config.rv770.max_simds = 2; 1249 1.1 riastrad rdev->config.rv770.max_backends = 1; 1250 1.1 riastrad rdev->config.rv770.max_gprs = 256; 1251 1.1 riastrad rdev->config.rv770.max_threads = 192; 1252 1.1 riastrad rdev->config.rv770.max_stack_entries = 256; 1253 1.1 riastrad rdev->config.rv770.max_hw_contexts = 4; 1254 1.1 riastrad rdev->config.rv770.max_gs_threads = 8 * 2; 1255 1.1 riastrad rdev->config.rv770.sx_max_export_size = 128; 1256 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size = 16; 1257 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size = 112; 1258 1.1 riastrad rdev->config.rv770.sq_num_cf_insts = 1; 1259 1.1 riastrad 1260 1.1 riastrad rdev->config.rv770.sx_num_of_sets = 7; 1261 1.1 riastrad rdev->config.rv770.sc_prim_fifo_size = 0x40; 1262 1.1 riastrad rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 1263 1.1 riastrad rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 1264 1.1 riastrad break; 1265 1.1 riastrad case CHIP_RV740: 1266 1.1 riastrad rdev->config.rv770.max_pipes = 4; 1267 1.1 riastrad rdev->config.rv770.max_tile_pipes = 4; 1268 1.1 riastrad rdev->config.rv770.max_simds = 8; 1269 1.1 riastrad rdev->config.rv770.max_backends = 4; 1270 1.1 riastrad rdev->config.rv770.max_gprs = 256; 1271 1.1 riastrad rdev->config.rv770.max_threads = 248; 1272 1.1 riastrad rdev->config.rv770.max_stack_entries = 512; 1273 1.1 riastrad rdev->config.rv770.max_hw_contexts = 8; 1274 1.1 riastrad rdev->config.rv770.max_gs_threads = 16 * 2; 1275 1.1 riastrad rdev->config.rv770.sx_max_export_size = 256; 1276 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size = 32; 1277 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size = 224; 1278 1.1 riastrad rdev->config.rv770.sq_num_cf_insts = 2; 1279 1.1 riastrad 1280 1.1 riastrad rdev->config.rv770.sx_num_of_sets = 7; 1281 1.1 riastrad rdev->config.rv770.sc_prim_fifo_size = 0x100; 1282 1.1 riastrad rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 1283 1.1 riastrad rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 1284 1.1 riastrad 1285 1.1 riastrad if (rdev->config.rv770.sx_max_export_pos_size > 16) { 1286 1.1 riastrad rdev->config.rv770.sx_max_export_pos_size -= 16; 1287 1.1 riastrad rdev->config.rv770.sx_max_export_smx_size += 16; 1288 1.1 riastrad } 1289 1.1 riastrad break; 1290 1.1 riastrad default: 1291 1.1 riastrad break; 1292 1.1 riastrad } 1293 1.1 riastrad 1294 1.1 riastrad /* Initialize HDP */ 1295 1.1 riastrad j = 0; 1296 1.1 riastrad for (i = 0; i < 32; i++) { 1297 1.1 riastrad WREG32((0x2c14 + j), 0x00000000); 1298 1.1 riastrad WREG32((0x2c18 + j), 0x00000000); 1299 1.1 riastrad WREG32((0x2c1c + j), 0x00000000); 1300 1.1 riastrad WREG32((0x2c20 + j), 0x00000000); 1301 1.1 riastrad WREG32((0x2c24 + j), 0x00000000); 1302 1.1 riastrad j += 0x18; 1303 1.1 riastrad } 1304 1.1 riastrad 1305 1.1 riastrad WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 1306 1.1 riastrad 1307 1.1 riastrad /* setup tiling, simd, pipe config */ 1308 1.1 riastrad mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 1309 1.1 riastrad 1310 1.1 riastrad shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG); 1311 1.1 riastrad inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT; 1312 1.1 riastrad for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) { 1313 1.1 riastrad if (!(inactive_pipes & tmp)) { 1314 1.1 riastrad active_number++; 1315 1.1 riastrad } 1316 1.1 riastrad tmp <<= 1; 1317 1.1 riastrad } 1318 1.1 riastrad if (active_number == 1) { 1319 1.1 riastrad WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1); 1320 1.1 riastrad } else { 1321 1.1 riastrad WREG32(SPI_CONFIG_CNTL, 0); 1322 1.1 riastrad } 1323 1.1 riastrad 1324 1.1 riastrad cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; 1325 1.1 riastrad tmp = rdev->config.rv770.max_simds - 1326 1.1 riastrad r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); 1327 1.1 riastrad rdev->config.rv770.active_simds = tmp; 1328 1.1 riastrad 1329 1.1 riastrad switch (rdev->config.rv770.max_tile_pipes) { 1330 1.1 riastrad case 1: 1331 1.1 riastrad default: 1332 1.1 riastrad gb_tiling_config = PIPE_TILING(0); 1333 1.1 riastrad break; 1334 1.1 riastrad case 2: 1335 1.1 riastrad gb_tiling_config = PIPE_TILING(1); 1336 1.1 riastrad break; 1337 1.1 riastrad case 4: 1338 1.1 riastrad gb_tiling_config = PIPE_TILING(2); 1339 1.1 riastrad break; 1340 1.1 riastrad case 8: 1341 1.1 riastrad gb_tiling_config = PIPE_TILING(3); 1342 1.1 riastrad break; 1343 1.1 riastrad } 1344 1.1 riastrad rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; 1345 1.1 riastrad 1346 1.1 riastrad disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; 1347 1.1 riastrad tmp = 0; 1348 1.1 riastrad for (i = 0; i < rdev->config.rv770.max_backends; i++) 1349 1.1 riastrad tmp |= (1 << i); 1350 1.1 riastrad /* if all the backends are disabled, fix it up here */ 1351 1.1 riastrad if ((disabled_rb_mask & tmp) == tmp) { 1352 1.1 riastrad for (i = 0; i < rdev->config.rv770.max_backends; i++) 1353 1.1 riastrad disabled_rb_mask &= ~(1 << i); 1354 1.1 riastrad } 1355 1.1 riastrad tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 1356 1.1 riastrad tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, 1357 1.1 riastrad R7XX_MAX_BACKENDS, disabled_rb_mask); 1358 1.1 riastrad gb_tiling_config |= tmp << 16; 1359 1.1 riastrad rdev->config.rv770.backend_map = tmp; 1360 1.1 riastrad 1361 1.1 riastrad if (rdev->family == CHIP_RV770) 1362 1.1 riastrad gb_tiling_config |= BANK_TILING(1); 1363 1.1 riastrad else { 1364 1.1 riastrad if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) 1365 1.1 riastrad gb_tiling_config |= BANK_TILING(1); 1366 1.1 riastrad else 1367 1.1 riastrad gb_tiling_config |= BANK_TILING(0); 1368 1.1 riastrad } 1369 1.1 riastrad rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); 1370 1.1 riastrad gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); 1371 1.1 riastrad if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { 1372 1.1 riastrad gb_tiling_config |= ROW_TILING(3); 1373 1.1 riastrad gb_tiling_config |= SAMPLE_SPLIT(3); 1374 1.1 riastrad } else { 1375 1.1 riastrad gb_tiling_config |= 1376 1.1 riastrad ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT)); 1377 1.1 riastrad gb_tiling_config |= 1378 1.1 riastrad SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT)); 1379 1.1 riastrad } 1380 1.1 riastrad 1381 1.1 riastrad gb_tiling_config |= BANK_SWAPS(1); 1382 1.1 riastrad rdev->config.rv770.tile_config = gb_tiling_config; 1383 1.1 riastrad 1384 1.1 riastrad WREG32(GB_TILING_CONFIG, gb_tiling_config); 1385 1.1 riastrad WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1386 1.1 riastrad WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1387 1.1 riastrad WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1388 1.1 riastrad WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff)); 1389 1.1 riastrad if (rdev->family == CHIP_RV730) { 1390 1.1 riastrad WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1391 1.1 riastrad WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1392 1.1 riastrad WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff)); 1393 1.1 riastrad } 1394 1.1 riastrad 1395 1.1 riastrad WREG32(CGTS_SYS_TCC_DISABLE, 0); 1396 1.1 riastrad WREG32(CGTS_TCC_DISABLE, 0); 1397 1.1 riastrad WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); 1398 1.1 riastrad WREG32(CGTS_USER_TCC_DISABLE, 0); 1399 1.1 riastrad 1400 1.1 riastrad 1401 1.1 riastrad num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); 1402 1.1 riastrad WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); 1403 1.1 riastrad WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); 1404 1.1 riastrad 1405 1.1 riastrad /* set HW defaults for 3D engine */ 1406 1.1 riastrad WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | 1407 1.1 riastrad ROQ_IB2_START(0x2b))); 1408 1.1 riastrad 1409 1.1 riastrad WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); 1410 1.1 riastrad 1411 1.1 riastrad ta_aux_cntl = RREG32(TA_CNTL_AUX); 1412 1.1 riastrad WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO); 1413 1.1 riastrad 1414 1.1 riastrad sx_debug_1 = RREG32(SX_DEBUG_1); 1415 1.1 riastrad sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 1416 1.1 riastrad WREG32(SX_DEBUG_1, sx_debug_1); 1417 1.1 riastrad 1418 1.1 riastrad smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 1419 1.1 riastrad smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff); 1420 1.1 riastrad smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1); 1421 1.1 riastrad WREG32(SMX_DC_CTL0, smx_dc_ctl0); 1422 1.1 riastrad 1423 1.1 riastrad if (rdev->family != CHIP_RV740) 1424 1.1 riastrad WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | 1425 1.1 riastrad GS_FLUSH_CTL(4) | 1426 1.1 riastrad ACK_FLUSH_CTL(3) | 1427 1.1 riastrad SYNC_FLUSH_CTL)); 1428 1.1 riastrad 1429 1.1 riastrad if (rdev->family != CHIP_RV770) 1430 1.1 riastrad WREG32(SMX_SAR_CTL0, 0x00003f3f); 1431 1.1 riastrad 1432 1.1 riastrad db_debug3 = RREG32(DB_DEBUG3); 1433 1.1 riastrad db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f); 1434 1.1 riastrad switch (rdev->family) { 1435 1.1 riastrad case CHIP_RV770: 1436 1.1 riastrad case CHIP_RV740: 1437 1.1 riastrad db_debug3 |= DB_CLK_OFF_DELAY(0x1f); 1438 1.1 riastrad break; 1439 1.1 riastrad case CHIP_RV710: 1440 1.1 riastrad case CHIP_RV730: 1441 1.1 riastrad default: 1442 1.1 riastrad db_debug3 |= DB_CLK_OFF_DELAY(2); 1443 1.1 riastrad break; 1444 1.1 riastrad } 1445 1.1 riastrad WREG32(DB_DEBUG3, db_debug3); 1446 1.1 riastrad 1447 1.1 riastrad if (rdev->family != CHIP_RV770) { 1448 1.1 riastrad db_debug4 = RREG32(DB_DEBUG4); 1449 1.1 riastrad db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER; 1450 1.1 riastrad WREG32(DB_DEBUG4, db_debug4); 1451 1.1 riastrad } 1452 1.1 riastrad 1453 1.1 riastrad WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) | 1454 1.1 riastrad POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) | 1455 1.1 riastrad SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1))); 1456 1.1 riastrad 1457 1.1 riastrad WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) | 1458 1.1 riastrad SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) | 1459 1.1 riastrad SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize))); 1460 1.1 riastrad 1461 1.1 riastrad WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 1462 1.1 riastrad 1463 1.1 riastrad WREG32(VGT_NUM_INSTANCES, 1); 1464 1.1 riastrad 1465 1.1 riastrad WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4)); 1466 1.1 riastrad 1467 1.1 riastrad WREG32(CP_PERFMON_CNTL, 0); 1468 1.1 riastrad 1469 1.1 riastrad sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) | 1470 1.1 riastrad DONE_FIFO_HIWATER(0xe0) | 1471 1.1 riastrad ALU_UPDATE_FIFO_HIWATER(0x8)); 1472 1.1 riastrad switch (rdev->family) { 1473 1.1 riastrad case CHIP_RV770: 1474 1.1 riastrad case CHIP_RV730: 1475 1.1 riastrad case CHIP_RV710: 1476 1.1 riastrad sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1); 1477 1.1 riastrad break; 1478 1.1 riastrad case CHIP_RV740: 1479 1.1 riastrad default: 1480 1.1 riastrad sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4); 1481 1.1 riastrad break; 1482 1.1 riastrad } 1483 1.1 riastrad WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes); 1484 1.1 riastrad 1485 1.1 riastrad /* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT 1486 1.1 riastrad * should be adjusted as needed by the 2D/3D drivers. This just sets default values 1487 1.1 riastrad */ 1488 1.1 riastrad sq_config = RREG32(SQ_CONFIG); 1489 1.1 riastrad sq_config &= ~(PS_PRIO(3) | 1490 1.1 riastrad VS_PRIO(3) | 1491 1.1 riastrad GS_PRIO(3) | 1492 1.1 riastrad ES_PRIO(3)); 1493 1.1 riastrad sq_config |= (DX9_CONSTS | 1494 1.1 riastrad VC_ENABLE | 1495 1.1 riastrad EXPORT_SRC_C | 1496 1.1 riastrad PS_PRIO(0) | 1497 1.1 riastrad VS_PRIO(1) | 1498 1.1 riastrad GS_PRIO(2) | 1499 1.1 riastrad ES_PRIO(3)); 1500 1.1 riastrad if (rdev->family == CHIP_RV710) 1501 1.1 riastrad /* no vertex cache */ 1502 1.1 riastrad sq_config &= ~VC_ENABLE; 1503 1.1 riastrad 1504 1.1 riastrad WREG32(SQ_CONFIG, sq_config); 1505 1.1 riastrad 1506 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_1, (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) | 1507 1.1 riastrad NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) | 1508 1.1 riastrad NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2))); 1509 1.1 riastrad 1510 1.1 riastrad WREG32(SQ_GPR_RESOURCE_MGMT_2, (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) | 1511 1.1 riastrad NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64))); 1512 1.1 riastrad 1513 1.1 riastrad sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) | 1514 1.1 riastrad NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) | 1515 1.1 riastrad NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8)); 1516 1.1 riastrad if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads) 1517 1.1 riastrad sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads); 1518 1.1 riastrad else 1519 1.1 riastrad sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8); 1520 1.1 riastrad WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt); 1521 1.1 riastrad 1522 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) | 1523 1.1 riastrad NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4))); 1524 1.1 riastrad 1525 1.1 riastrad WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) | 1526 1.1 riastrad NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4))); 1527 1.1 riastrad 1528 1.1 riastrad sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) | 1529 1.1 riastrad SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) | 1530 1.1 riastrad SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) | 1531 1.1 riastrad SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64)); 1532 1.1 riastrad 1533 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0); 1534 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0); 1535 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0); 1536 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0); 1537 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0); 1538 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0); 1539 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0); 1540 1.1 riastrad WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0); 1541 1.1 riastrad 1542 1.1 riastrad WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 1543 1.1 riastrad FORCE_EOV_MAX_REZ_CNT(255))); 1544 1.1 riastrad 1545 1.1 riastrad if (rdev->family == CHIP_RV710) 1546 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) | 1547 1.1 riastrad AUTO_INVLD_EN(ES_AND_GS_AUTO))); 1548 1.1 riastrad else 1549 1.1 riastrad WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) | 1550 1.1 riastrad AUTO_INVLD_EN(ES_AND_GS_AUTO))); 1551 1.1 riastrad 1552 1.1 riastrad switch (rdev->family) { 1553 1.1 riastrad case CHIP_RV770: 1554 1.1 riastrad case CHIP_RV730: 1555 1.1 riastrad case CHIP_RV740: 1556 1.1 riastrad gs_prim_buffer_depth = 384; 1557 1.1 riastrad break; 1558 1.1 riastrad case CHIP_RV710: 1559 1.1 riastrad gs_prim_buffer_depth = 128; 1560 1.1 riastrad break; 1561 1.1 riastrad default: 1562 1.1 riastrad break; 1563 1.1 riastrad } 1564 1.1 riastrad 1565 1.1 riastrad num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16; 1566 1.1 riastrad vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread; 1567 1.1 riastrad /* Max value for this is 256 */ 1568 1.1 riastrad if (vgt_gs_per_es > 256) 1569 1.1 riastrad vgt_gs_per_es = 256; 1570 1.1 riastrad 1571 1.1 riastrad WREG32(VGT_ES_PER_GS, 128); 1572 1.1 riastrad WREG32(VGT_GS_PER_ES, vgt_gs_per_es); 1573 1.1 riastrad WREG32(VGT_GS_PER_VS, 2); 1574 1.1 riastrad 1575 1.1 riastrad /* more default values. 2D/3D driver should adjust as needed */ 1576 1.1 riastrad WREG32(VGT_GS_VERTEX_REUSE, 16); 1577 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 1578 1.1 riastrad WREG32(VGT_STRMOUT_EN, 0); 1579 1.1 riastrad WREG32(SX_MISC, 0); 1580 1.1 riastrad WREG32(PA_SC_MODE_CNTL, 0); 1581 1.1 riastrad WREG32(PA_SC_EDGERULE, 0xaaaaaaaa); 1582 1.1 riastrad WREG32(PA_SC_AA_CONFIG, 0); 1583 1.1 riastrad WREG32(PA_SC_CLIPRECT_RULE, 0xffff); 1584 1.1 riastrad WREG32(PA_SC_LINE_STIPPLE, 0); 1585 1.1 riastrad WREG32(SPI_INPUT_Z, 0); 1586 1.1 riastrad WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2)); 1587 1.1 riastrad WREG32(CB_COLOR7_FRAG, 0); 1588 1.1 riastrad 1589 1.1 riastrad /* clear render buffer base addresses */ 1590 1.1 riastrad WREG32(CB_COLOR0_BASE, 0); 1591 1.1 riastrad WREG32(CB_COLOR1_BASE, 0); 1592 1.1 riastrad WREG32(CB_COLOR2_BASE, 0); 1593 1.1 riastrad WREG32(CB_COLOR3_BASE, 0); 1594 1.1 riastrad WREG32(CB_COLOR4_BASE, 0); 1595 1.1 riastrad WREG32(CB_COLOR5_BASE, 0); 1596 1.1 riastrad WREG32(CB_COLOR6_BASE, 0); 1597 1.1 riastrad WREG32(CB_COLOR7_BASE, 0); 1598 1.1 riastrad 1599 1.1 riastrad WREG32(TCP_CNTL, 0); 1600 1.1 riastrad 1601 1.1 riastrad hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 1602 1.1 riastrad WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 1603 1.1 riastrad 1604 1.1 riastrad WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 1605 1.1 riastrad 1606 1.1 riastrad WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | 1607 1.1 riastrad NUM_CLIP_SEQ(3))); 1608 1.1 riastrad WREG32(VC_ENHANCE, 0); 1609 1.1 riastrad } 1610 1.1 riastrad 1611 1.1 riastrad void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) 1612 1.1 riastrad { 1613 1.1 riastrad u64 size_bf, size_af; 1614 1.1 riastrad 1615 1.1 riastrad if (mc->mc_vram_size > 0xE0000000) { 1616 1.1 riastrad /* leave room for at least 512M GTT */ 1617 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1618 1.1 riastrad mc->real_vram_size = 0xE0000000; 1619 1.1 riastrad mc->mc_vram_size = 0xE0000000; 1620 1.1 riastrad } 1621 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1622 1.1 riastrad size_bf = mc->gtt_start; 1623 1.1 riastrad size_af = mc->mc_mask - mc->gtt_end; 1624 1.1 riastrad if (size_bf > size_af) { 1625 1.1 riastrad if (mc->mc_vram_size > size_bf) { 1626 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1627 1.1 riastrad mc->real_vram_size = size_bf; 1628 1.1 riastrad mc->mc_vram_size = size_bf; 1629 1.1 riastrad } 1630 1.1 riastrad mc->vram_start = mc->gtt_start - mc->mc_vram_size; 1631 1.1 riastrad } else { 1632 1.1 riastrad if (mc->mc_vram_size > size_af) { 1633 1.1 riastrad dev_warn(rdev->dev, "limiting VRAM\n"); 1634 1.1 riastrad mc->real_vram_size = size_af; 1635 1.1 riastrad mc->mc_vram_size = size_af; 1636 1.1 riastrad } 1637 1.1 riastrad mc->vram_start = mc->gtt_end + 1; 1638 1.1 riastrad } 1639 1.1 riastrad mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; 1640 1.1 riastrad dev_info(rdev->dev, "VRAM: %"PRIu64"M 0x%08"PRIX64" - 0x%08"PRIX64" (%"PRIu64"M used)\n", 1641 1.1 riastrad mc->mc_vram_size >> 20, mc->vram_start, 1642 1.1 riastrad mc->vram_end, mc->real_vram_size >> 20); 1643 1.1 riastrad } else { 1644 1.1 riastrad radeon_vram_location(rdev, &rdev->mc, 0); 1645 1.1 riastrad rdev->mc.gtt_base_align = 0; 1646 1.1 riastrad radeon_gtt_location(rdev, mc); 1647 1.1 riastrad } 1648 1.1 riastrad } 1649 1.1 riastrad 1650 1.1 riastrad static int rv770_mc_init(struct radeon_device *rdev) 1651 1.1 riastrad { 1652 1.1 riastrad u32 tmp; 1653 1.1 riastrad int chansize, numchan; 1654 1.1 riastrad 1655 1.1 riastrad /* Get VRAM informations */ 1656 1.1 riastrad rdev->mc.vram_is_ddr = true; 1657 1.1 riastrad tmp = RREG32(MC_ARB_RAMCFG); 1658 1.1 riastrad if (tmp & CHANSIZE_OVERRIDE) { 1659 1.1 riastrad chansize = 16; 1660 1.1 riastrad } else if (tmp & CHANSIZE_MASK) { 1661 1.1 riastrad chansize = 64; 1662 1.1 riastrad } else { 1663 1.1 riastrad chansize = 32; 1664 1.1 riastrad } 1665 1.1 riastrad tmp = RREG32(MC_SHARED_CHMAP); 1666 1.1 riastrad switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { 1667 1.1 riastrad case 0: 1668 1.1 riastrad default: 1669 1.1 riastrad numchan = 1; 1670 1.1 riastrad break; 1671 1.1 riastrad case 1: 1672 1.1 riastrad numchan = 2; 1673 1.1 riastrad break; 1674 1.1 riastrad case 2: 1675 1.1 riastrad numchan = 4; 1676 1.1 riastrad break; 1677 1.1 riastrad case 3: 1678 1.1 riastrad numchan = 8; 1679 1.1 riastrad break; 1680 1.1 riastrad } 1681 1.1 riastrad rdev->mc.vram_width = numchan * chansize; 1682 1.1 riastrad /* Could aper size report 0 ? */ 1683 1.1 riastrad rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 1684 1.1 riastrad rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 1685 1.1 riastrad /* Setup GPU memory space */ 1686 1.1 riastrad rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1687 1.1 riastrad rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1688 1.1 riastrad rdev->mc.visible_vram_size = rdev->mc.aper_size; 1689 1.1 riastrad r700_vram_gtt_location(rdev, &rdev->mc); 1690 1.1 riastrad radeon_update_bandwidth_info(rdev); 1691 1.1 riastrad 1692 1.1 riastrad return 0; 1693 1.1 riastrad } 1694 1.1 riastrad 1695 1.2 riastrad static void rv770_uvd_init(struct radeon_device *rdev) 1696 1.2 riastrad { 1697 1.2 riastrad int r; 1698 1.2 riastrad 1699 1.2 riastrad if (!rdev->has_uvd) 1700 1.2 riastrad return; 1701 1.2 riastrad 1702 1.2 riastrad r = radeon_uvd_init(rdev); 1703 1.2 riastrad if (r) { 1704 1.2 riastrad dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 1705 1.2 riastrad /* 1706 1.2 riastrad * At this point rdev->uvd.vcpu_bo is NULL which trickles down 1707 1.2 riastrad * to early fails uvd_v2_2_resume() and thus nothing happens 1708 1.2 riastrad * there. So it is pointless to try to go through that code 1709 1.2 riastrad * hence why we disable uvd here. 1710 1.2 riastrad */ 1711 1.2 riastrad rdev->has_uvd = false; 1712 1.2 riastrad return; 1713 1.2 riastrad } 1714 1.2 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 1715 1.2 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 1716 1.2 riastrad } 1717 1.2 riastrad 1718 1.2 riastrad static void rv770_uvd_start(struct radeon_device *rdev) 1719 1.2 riastrad { 1720 1.2 riastrad int r; 1721 1.2 riastrad 1722 1.2 riastrad if (!rdev->has_uvd) 1723 1.2 riastrad return; 1724 1.2 riastrad 1725 1.2 riastrad r = uvd_v2_2_resume(rdev); 1726 1.2 riastrad if (r) { 1727 1.2 riastrad dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 1728 1.2 riastrad goto error; 1729 1.2 riastrad } 1730 1.2 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 1731 1.2 riastrad if (r) { 1732 1.2 riastrad dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 1733 1.2 riastrad goto error; 1734 1.2 riastrad } 1735 1.2 riastrad return; 1736 1.2 riastrad 1737 1.2 riastrad error: 1738 1.2 riastrad rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 1739 1.2 riastrad } 1740 1.2 riastrad 1741 1.2 riastrad static void rv770_uvd_resume(struct radeon_device *rdev) 1742 1.2 riastrad { 1743 1.2 riastrad struct radeon_ring *ring; 1744 1.2 riastrad int r; 1745 1.2 riastrad 1746 1.2 riastrad if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 1747 1.2 riastrad return; 1748 1.2 riastrad 1749 1.2 riastrad ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 1750 1.2 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 1751 1.2 riastrad if (r) { 1752 1.2 riastrad dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 1753 1.2 riastrad return; 1754 1.2 riastrad } 1755 1.2 riastrad r = uvd_v1_0_init(rdev); 1756 1.2 riastrad if (r) { 1757 1.2 riastrad dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 1758 1.2 riastrad return; 1759 1.2 riastrad } 1760 1.2 riastrad } 1761 1.2 riastrad 1762 1.1 riastrad static int rv770_startup(struct radeon_device *rdev) 1763 1.1 riastrad { 1764 1.1 riastrad struct radeon_ring *ring; 1765 1.1 riastrad int r; 1766 1.1 riastrad 1767 1.1 riastrad /* enable pcie gen2 link */ 1768 1.1 riastrad rv770_pcie_gen2_enable(rdev); 1769 1.1 riastrad 1770 1.1 riastrad /* scratch needs to be initialized before MC */ 1771 1.1 riastrad r = r600_vram_scratch_init(rdev); 1772 1.1 riastrad if (r) 1773 1.1 riastrad return r; 1774 1.1 riastrad 1775 1.1 riastrad rv770_mc_program(rdev); 1776 1.1 riastrad 1777 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1778 1.1 riastrad rv770_agp_enable(rdev); 1779 1.1 riastrad } else { 1780 1.1 riastrad r = rv770_pcie_gart_enable(rdev); 1781 1.1 riastrad if (r) 1782 1.1 riastrad return r; 1783 1.1 riastrad } 1784 1.1 riastrad 1785 1.1 riastrad rv770_gpu_init(rdev); 1786 1.1 riastrad 1787 1.1 riastrad /* allocate wb buffer */ 1788 1.1 riastrad r = radeon_wb_init(rdev); 1789 1.1 riastrad if (r) 1790 1.1 riastrad return r; 1791 1.1 riastrad 1792 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 1793 1.1 riastrad if (r) { 1794 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 1795 1.1 riastrad return r; 1796 1.1 riastrad } 1797 1.1 riastrad 1798 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 1799 1.1 riastrad if (r) { 1800 1.1 riastrad dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 1801 1.1 riastrad return r; 1802 1.1 riastrad } 1803 1.1 riastrad 1804 1.2 riastrad rv770_uvd_start(rdev); 1805 1.1 riastrad 1806 1.1 riastrad /* Enable IRQ */ 1807 1.1 riastrad if (!rdev->irq.installed) { 1808 1.1 riastrad r = radeon_irq_kms_init(rdev); 1809 1.1 riastrad if (r) 1810 1.1 riastrad return r; 1811 1.1 riastrad } 1812 1.1 riastrad 1813 1.1 riastrad r = r600_irq_init(rdev); 1814 1.1 riastrad if (r) { 1815 1.1 riastrad DRM_ERROR("radeon: IH init failed (%d).\n", r); 1816 1.1 riastrad radeon_irq_kms_fini(rdev); 1817 1.1 riastrad return r; 1818 1.1 riastrad } 1819 1.1 riastrad r600_irq_set(rdev); 1820 1.1 riastrad 1821 1.1 riastrad ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1822 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 1823 1.1 riastrad RADEON_CP_PACKET2); 1824 1.1 riastrad if (r) 1825 1.1 riastrad return r; 1826 1.1 riastrad 1827 1.1 riastrad ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 1828 1.1 riastrad r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 1829 1.1 riastrad DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 1830 1.1 riastrad if (r) 1831 1.1 riastrad return r; 1832 1.1 riastrad 1833 1.1 riastrad r = rv770_cp_load_microcode(rdev); 1834 1.1 riastrad if (r) 1835 1.1 riastrad return r; 1836 1.1 riastrad r = r600_cp_resume(rdev); 1837 1.1 riastrad if (r) 1838 1.1 riastrad return r; 1839 1.1 riastrad 1840 1.1 riastrad r = r600_dma_resume(rdev); 1841 1.1 riastrad if (r) 1842 1.1 riastrad return r; 1843 1.1 riastrad 1844 1.2 riastrad rv770_uvd_resume(rdev); 1845 1.1 riastrad 1846 1.1 riastrad r = radeon_ib_pool_init(rdev); 1847 1.1 riastrad if (r) { 1848 1.1 riastrad dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 1849 1.1 riastrad return r; 1850 1.1 riastrad } 1851 1.1 riastrad 1852 1.1 riastrad r = radeon_audio_init(rdev); 1853 1.1 riastrad if (r) { 1854 1.1 riastrad DRM_ERROR("radeon: audio init failed\n"); 1855 1.1 riastrad return r; 1856 1.1 riastrad } 1857 1.1 riastrad 1858 1.1 riastrad return 0; 1859 1.1 riastrad } 1860 1.1 riastrad 1861 1.1 riastrad int rv770_resume(struct radeon_device *rdev) 1862 1.1 riastrad { 1863 1.1 riastrad int r; 1864 1.1 riastrad 1865 1.1 riastrad /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 1866 1.1 riastrad * posting will perform necessary task to bring back GPU into good 1867 1.1 riastrad * shape. 1868 1.1 riastrad */ 1869 1.1 riastrad /* post card */ 1870 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 1871 1.1 riastrad 1872 1.1 riastrad /* init golden registers */ 1873 1.1 riastrad rv770_init_golden_registers(rdev); 1874 1.1 riastrad 1875 1.1 riastrad if (rdev->pm.pm_method == PM_METHOD_DPM) 1876 1.1 riastrad radeon_pm_resume(rdev); 1877 1.1 riastrad 1878 1.1 riastrad rdev->accel_working = true; 1879 1.1 riastrad r = rv770_startup(rdev); 1880 1.1 riastrad if (r) { 1881 1.1 riastrad DRM_ERROR("r600 startup failed on resume\n"); 1882 1.1 riastrad rdev->accel_working = false; 1883 1.1 riastrad return r; 1884 1.1 riastrad } 1885 1.1 riastrad 1886 1.1 riastrad return r; 1887 1.1 riastrad 1888 1.1 riastrad } 1889 1.1 riastrad 1890 1.1 riastrad int rv770_suspend(struct radeon_device *rdev) 1891 1.1 riastrad { 1892 1.1 riastrad radeon_pm_suspend(rdev); 1893 1.1 riastrad radeon_audio_fini(rdev); 1894 1.2 riastrad if (rdev->has_uvd) { 1895 1.2 riastrad uvd_v1_0_fini(rdev); 1896 1.2 riastrad radeon_uvd_suspend(rdev); 1897 1.2 riastrad } 1898 1.1 riastrad r700_cp_stop(rdev); 1899 1.1 riastrad r600_dma_stop(rdev); 1900 1.1 riastrad r600_irq_suspend(rdev); 1901 1.1 riastrad radeon_wb_disable(rdev); 1902 1.1 riastrad rv770_pcie_gart_disable(rdev); 1903 1.1 riastrad 1904 1.1 riastrad return 0; 1905 1.1 riastrad } 1906 1.1 riastrad 1907 1.1 riastrad /* Plan is to move initialization in that function and use 1908 1.1 riastrad * helper function so that radeon_device_init pretty much 1909 1.1 riastrad * do nothing more than calling asic specific function. This 1910 1.1 riastrad * should also allow to remove a bunch of callback function 1911 1.1 riastrad * like vram_info. 1912 1.1 riastrad */ 1913 1.1 riastrad int rv770_init(struct radeon_device *rdev) 1914 1.1 riastrad { 1915 1.1 riastrad int r; 1916 1.1 riastrad 1917 1.1 riastrad /* Read BIOS */ 1918 1.1 riastrad if (!radeon_get_bios(rdev)) { 1919 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 1920 1.1 riastrad return -EINVAL; 1921 1.1 riastrad } 1922 1.1 riastrad /* Must be an ATOMBIOS */ 1923 1.1 riastrad if (!rdev->is_atom_bios) { 1924 1.1 riastrad dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); 1925 1.1 riastrad return -EINVAL; 1926 1.1 riastrad } 1927 1.1 riastrad r = radeon_atombios_init(rdev); 1928 1.1 riastrad if (r) 1929 1.1 riastrad return r; 1930 1.1 riastrad /* Post card if necessary */ 1931 1.1 riastrad if (!radeon_card_posted(rdev)) { 1932 1.1 riastrad if (!rdev->bios) { 1933 1.1 riastrad dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 1934 1.1 riastrad return -EINVAL; 1935 1.1 riastrad } 1936 1.1 riastrad DRM_INFO("GPU not posted. posting now...\n"); 1937 1.1 riastrad atom_asic_init(rdev->mode_info.atom_context); 1938 1.1 riastrad } 1939 1.1 riastrad /* init golden registers */ 1940 1.1 riastrad rv770_init_golden_registers(rdev); 1941 1.1 riastrad /* Initialize scratch registers */ 1942 1.1 riastrad r600_scratch_init(rdev); 1943 1.1 riastrad /* Initialize surface registers */ 1944 1.1 riastrad radeon_surface_init(rdev); 1945 1.1 riastrad /* Initialize clocks */ 1946 1.1 riastrad radeon_get_clock_info(rdev->ddev); 1947 1.1 riastrad /* Fence driver */ 1948 1.1 riastrad r = radeon_fence_driver_init(rdev); 1949 1.1 riastrad if (r) 1950 1.1 riastrad return r; 1951 1.1 riastrad /* initialize AGP */ 1952 1.1 riastrad if (rdev->flags & RADEON_IS_AGP) { 1953 1.1 riastrad r = radeon_agp_init(rdev); 1954 1.1 riastrad if (r) 1955 1.1 riastrad radeon_agp_disable(rdev); 1956 1.1 riastrad } 1957 1.1 riastrad r = rv770_mc_init(rdev); 1958 1.1 riastrad if (r) 1959 1.1 riastrad return r; 1960 1.1 riastrad /* Memory manager */ 1961 1.1 riastrad r = radeon_bo_init(rdev); 1962 1.1 riastrad if (r) 1963 1.1 riastrad return r; 1964 1.1 riastrad 1965 1.1 riastrad if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 1966 1.1 riastrad r = r600_init_microcode(rdev); 1967 1.1 riastrad if (r) { 1968 1.1 riastrad DRM_ERROR("Failed to load firmware!\n"); 1969 1.1 riastrad return r; 1970 1.1 riastrad } 1971 1.1 riastrad } 1972 1.1 riastrad 1973 1.1 riastrad /* Initialize power management */ 1974 1.1 riastrad radeon_pm_init(rdev); 1975 1.1 riastrad 1976 1.1 riastrad rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 1977 1.1 riastrad r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 1978 1.1 riastrad 1979 1.1 riastrad rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL; 1980 1.1 riastrad r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024); 1981 1.1 riastrad 1982 1.2 riastrad rv770_uvd_init(rdev); 1983 1.1 riastrad 1984 1.1 riastrad rdev->ih.ring_obj = NULL; 1985 1.1 riastrad r600_ih_ring_init(rdev, 64 * 1024); 1986 1.1 riastrad 1987 1.1 riastrad r = r600_pcie_gart_init(rdev); 1988 1.1 riastrad if (r) 1989 1.1 riastrad return r; 1990 1.1 riastrad 1991 1.1 riastrad rdev->accel_working = true; 1992 1.1 riastrad r = rv770_startup(rdev); 1993 1.1 riastrad if (r) { 1994 1.1 riastrad dev_err(rdev->dev, "disabling GPU acceleration\n"); 1995 1.1 riastrad r700_cp_fini(rdev); 1996 1.1 riastrad r600_dma_fini(rdev); 1997 1.1 riastrad r600_irq_fini(rdev); 1998 1.1 riastrad radeon_wb_fini(rdev); 1999 1.1 riastrad radeon_ib_pool_fini(rdev); 2000 1.1 riastrad radeon_irq_kms_fini(rdev); 2001 1.1 riastrad rv770_pcie_gart_fini(rdev); 2002 1.1 riastrad rdev->accel_working = false; 2003 1.1 riastrad } 2004 1.1 riastrad 2005 1.1 riastrad return 0; 2006 1.1 riastrad } 2007 1.1 riastrad 2008 1.1 riastrad void rv770_fini(struct radeon_device *rdev) 2009 1.1 riastrad { 2010 1.1 riastrad radeon_pm_fini(rdev); 2011 1.1 riastrad r700_cp_fini(rdev); 2012 1.1 riastrad r600_dma_fini(rdev); 2013 1.1 riastrad r600_irq_fini(rdev); 2014 1.1 riastrad radeon_wb_fini(rdev); 2015 1.1 riastrad radeon_ib_pool_fini(rdev); 2016 1.1 riastrad radeon_irq_kms_fini(rdev); 2017 1.1 riastrad uvd_v1_0_fini(rdev); 2018 1.1 riastrad radeon_uvd_fini(rdev); 2019 1.1 riastrad rv770_pcie_gart_fini(rdev); 2020 1.1 riastrad r600_vram_scratch_fini(rdev); 2021 1.1 riastrad radeon_gem_fini(rdev); 2022 1.1 riastrad radeon_fence_driver_fini(rdev); 2023 1.1 riastrad radeon_agp_fini(rdev); 2024 1.1 riastrad radeon_bo_fini(rdev); 2025 1.1 riastrad radeon_atombios_fini(rdev); 2026 1.1 riastrad kfree(rdev->bios); 2027 1.1 riastrad rdev->bios = NULL; 2028 1.1 riastrad } 2029 1.1 riastrad 2030 1.1 riastrad static void rv770_pcie_gen2_enable(struct radeon_device *rdev) 2031 1.1 riastrad { 2032 1.1 riastrad u32 link_width_cntl, lanes, speed_cntl, tmp; 2033 1.1 riastrad u16 link_cntl2; 2034 1.1 riastrad 2035 1.1 riastrad if (radeon_pcie_gen2 == 0) 2036 1.1 riastrad return; 2037 1.1 riastrad 2038 1.1 riastrad if (rdev->flags & RADEON_IS_IGP) 2039 1.1 riastrad return; 2040 1.1 riastrad 2041 1.1 riastrad if (!(rdev->flags & RADEON_IS_PCIE)) 2042 1.1 riastrad return; 2043 1.1 riastrad 2044 1.1 riastrad /* x2 cards have a special sequence */ 2045 1.1 riastrad if (ASIC_IS_X2(rdev)) 2046 1.1 riastrad return; 2047 1.1 riastrad 2048 1.1 riastrad if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && 2049 1.1 riastrad (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) 2050 1.1 riastrad return; 2051 1.1 riastrad 2052 1.1 riastrad DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); 2053 1.1 riastrad 2054 1.1 riastrad /* advertise upconfig capability */ 2055 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 2056 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 2057 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 2058 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 2059 1.1 riastrad if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) { 2060 1.1 riastrad lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT; 2061 1.1 riastrad link_width_cntl &= ~(LC_LINK_WIDTH_MASK | 2062 1.1 riastrad LC_RECONFIG_ARC_MISSING_ESCAPE); 2063 1.1 riastrad link_width_cntl |= lanes | LC_RECONFIG_NOW | 2064 1.1 riastrad LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT; 2065 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 2066 1.1 riastrad } else { 2067 1.1 riastrad link_width_cntl |= LC_UPCONFIGURE_DIS; 2068 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 2069 1.1 riastrad } 2070 1.1 riastrad 2071 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 2072 1.1 riastrad if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) && 2073 1.1 riastrad (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 2074 1.1 riastrad 2075 1.1 riastrad tmp = RREG32(0x541c); 2076 1.1 riastrad WREG32(0x541c, tmp | 0x8); 2077 1.1 riastrad WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN); 2078 1.1 riastrad link_cntl2 = RREG16(0x4088); 2079 1.1 riastrad link_cntl2 &= ~TARGET_LINK_SPEED_MASK; 2080 1.1 riastrad link_cntl2 |= 0x2; 2081 1.1 riastrad WREG16(0x4088, link_cntl2); 2082 1.1 riastrad WREG32(MM_CFGREGS_CNTL, 0); 2083 1.1 riastrad 2084 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 2085 1.1 riastrad speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 2086 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 2087 1.1 riastrad 2088 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 2089 1.1 riastrad speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; 2090 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 2091 1.1 riastrad 2092 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 2093 1.1 riastrad speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; 2094 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 2095 1.1 riastrad 2096 1.1 riastrad speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 2097 1.1 riastrad speed_cntl |= LC_GEN2_EN_STRAP; 2098 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 2099 1.1 riastrad 2100 1.1 riastrad } else { 2101 1.1 riastrad link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 2102 1.1 riastrad /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 2103 1.1 riastrad if (1) 2104 1.1 riastrad link_width_cntl |= LC_UPCONFIGURE_DIS; 2105 1.1 riastrad else 2106 1.1 riastrad link_width_cntl &= ~LC_UPCONFIGURE_DIS; 2107 1.1 riastrad WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 2108 1.1 riastrad } 2109 1.1 riastrad } 2110