0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include <linux/firmware.h>
0030 #include <linux/pci.h>
0031 #include <linux/slab.h>
0032
0033 #include <drm/drm_device.h>
0034 #include <drm/radeon_drm.h>
0035 #include <drm/drm_fourcc.h>
0036 #include <drm/drm_framebuffer.h>
0037
0038 #include "atom.h"
0039 #include "avivod.h"
0040 #include "radeon.h"
0041 #include "radeon_asic.h"
0042 #include "radeon_audio.h"
0043 #include "rv770d.h"
0044 #include "rv770.h"
0045
0046 #define R700_PFP_UCODE_SIZE 848
0047 #define R700_PM4_UCODE_SIZE 1360
0048
0049 static void rv770_gpu_init(struct radeon_device *rdev);
0050 void rv770_fini(struct radeon_device *rdev);
0051 static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
0052 int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
0053
0054 int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
0055 {
0056 unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
0057 int r;
0058
0059
0060 if (rdev->family == CHIP_RV740)
0061 return evergreen_set_uvd_clocks(rdev, vclk, dclk);
0062
0063
0064 WREG32_P(CG_UPLL_FUNC_CNTL_2,
0065 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
0066 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
0067
0068 if (!vclk || !dclk) {
0069
0070 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
0071 return 0;
0072 }
0073
0074 r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
0075 43663, 0x03FFFFFE, 1, 30, ~0,
0076 &fb_div, &vclk_div, &dclk_div);
0077 if (r)
0078 return r;
0079
0080 fb_div |= 1;
0081 vclk_div -= 1;
0082 dclk_div -= 1;
0083
0084
0085 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
0086
0087
0088 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
0089
0090
0091 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
0092 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
0093
0094 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
0095 if (r)
0096 return r;
0097
0098
0099 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
0100
0101
0102 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
0103 WREG32_P(CG_UPLL_FUNC_CNTL_2,
0104 UPLL_SW_HILEN(vclk_div >> 1) |
0105 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
0106 UPLL_SW_HILEN2(dclk_div >> 1) |
0107 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
0108 ~UPLL_SW_MASK);
0109
0110 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
0111 ~UPLL_FB_DIV_MASK);
0112
0113
0114 mdelay(15);
0115
0116
0117 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
0118
0119 mdelay(15);
0120
0121
0122 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
0123 WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
0124
0125 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
0126 if (r)
0127 return r;
0128
0129
0130 WREG32_P(CG_UPLL_FUNC_CNTL_2,
0131 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
0132 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
0133
0134 mdelay(100);
0135
0136 return 0;
0137 }
0138
0139 static const u32 r7xx_golden_registers[] =
0140 {
0141 0x8d00, 0xffffffff, 0x0e0e0074,
0142 0x8d04, 0xffffffff, 0x013a2b34,
0143 0x9508, 0xffffffff, 0x00000002,
0144 0x8b20, 0xffffffff, 0,
0145 0x88c4, 0xffffffff, 0x000000c2,
0146 0x28350, 0xffffffff, 0,
0147 0x9058, 0xffffffff, 0x0fffc40f,
0148 0x240c, 0xffffffff, 0x00000380,
0149 0x733c, 0xffffffff, 0x00000002,
0150 0x2650, 0x00040000, 0,
0151 0x20bc, 0x00040000, 0,
0152 0x7300, 0xffffffff, 0x001000f0
0153 };
0154
0155 static const u32 r7xx_golden_dyn_gpr_registers[] =
0156 {
0157 0x8db0, 0xffffffff, 0x98989898,
0158 0x8db4, 0xffffffff, 0x98989898,
0159 0x8db8, 0xffffffff, 0x98989898,
0160 0x8dbc, 0xffffffff, 0x98989898,
0161 0x8dc0, 0xffffffff, 0x98989898,
0162 0x8dc4, 0xffffffff, 0x98989898,
0163 0x8dc8, 0xffffffff, 0x98989898,
0164 0x8dcc, 0xffffffff, 0x98989898,
0165 0x88c4, 0xffffffff, 0x00000082
0166 };
0167
0168 static const u32 rv770_golden_registers[] =
0169 {
0170 0x562c, 0xffffffff, 0,
0171 0x3f90, 0xffffffff, 0,
0172 0x9148, 0xffffffff, 0,
0173 0x3f94, 0xffffffff, 0,
0174 0x914c, 0xffffffff, 0,
0175 0x9698, 0x18000000, 0x18000000
0176 };
0177
0178 static const u32 rv770ce_golden_registers[] =
0179 {
0180 0x562c, 0xffffffff, 0,
0181 0x3f90, 0xffffffff, 0x00cc0000,
0182 0x9148, 0xffffffff, 0x00cc0000,
0183 0x3f94, 0xffffffff, 0x00cc0000,
0184 0x914c, 0xffffffff, 0x00cc0000,
0185 0x9b7c, 0xffffffff, 0x00fa0000,
0186 0x3f8c, 0xffffffff, 0x00fa0000,
0187 0x9698, 0x18000000, 0x18000000
0188 };
0189
0190 static const u32 rv770_mgcg_init[] =
0191 {
0192 0x8bcc, 0xffffffff, 0x130300f9,
0193 0x5448, 0xffffffff, 0x100,
0194 0x55e4, 0xffffffff, 0x100,
0195 0x160c, 0xffffffff, 0x100,
0196 0x5644, 0xffffffff, 0x100,
0197 0xc164, 0xffffffff, 0x100,
0198 0x8a18, 0xffffffff, 0x100,
0199 0x897c, 0xffffffff, 0x8000100,
0200 0x8b28, 0xffffffff, 0x3c000100,
0201 0x9144, 0xffffffff, 0x100,
0202 0x9a1c, 0xffffffff, 0x10000,
0203 0x9a50, 0xffffffff, 0x100,
0204 0x9a1c, 0xffffffff, 0x10001,
0205 0x9a50, 0xffffffff, 0x100,
0206 0x9a1c, 0xffffffff, 0x10002,
0207 0x9a50, 0xffffffff, 0x100,
0208 0x9a1c, 0xffffffff, 0x10003,
0209 0x9a50, 0xffffffff, 0x100,
0210 0x9a1c, 0xffffffff, 0x0,
0211 0x9870, 0xffffffff, 0x100,
0212 0x8d58, 0xffffffff, 0x100,
0213 0x9500, 0xffffffff, 0x0,
0214 0x9510, 0xffffffff, 0x100,
0215 0x9500, 0xffffffff, 0x1,
0216 0x9510, 0xffffffff, 0x100,
0217 0x9500, 0xffffffff, 0x2,
0218 0x9510, 0xffffffff, 0x100,
0219 0x9500, 0xffffffff, 0x3,
0220 0x9510, 0xffffffff, 0x100,
0221 0x9500, 0xffffffff, 0x4,
0222 0x9510, 0xffffffff, 0x100,
0223 0x9500, 0xffffffff, 0x5,
0224 0x9510, 0xffffffff, 0x100,
0225 0x9500, 0xffffffff, 0x6,
0226 0x9510, 0xffffffff, 0x100,
0227 0x9500, 0xffffffff, 0x7,
0228 0x9510, 0xffffffff, 0x100,
0229 0x9500, 0xffffffff, 0x8,
0230 0x9510, 0xffffffff, 0x100,
0231 0x9500, 0xffffffff, 0x9,
0232 0x9510, 0xffffffff, 0x100,
0233 0x9500, 0xffffffff, 0x8000,
0234 0x9490, 0xffffffff, 0x0,
0235 0x949c, 0xffffffff, 0x100,
0236 0x9490, 0xffffffff, 0x1,
0237 0x949c, 0xffffffff, 0x100,
0238 0x9490, 0xffffffff, 0x2,
0239 0x949c, 0xffffffff, 0x100,
0240 0x9490, 0xffffffff, 0x3,
0241 0x949c, 0xffffffff, 0x100,
0242 0x9490, 0xffffffff, 0x4,
0243 0x949c, 0xffffffff, 0x100,
0244 0x9490, 0xffffffff, 0x5,
0245 0x949c, 0xffffffff, 0x100,
0246 0x9490, 0xffffffff, 0x6,
0247 0x949c, 0xffffffff, 0x100,
0248 0x9490, 0xffffffff, 0x7,
0249 0x949c, 0xffffffff, 0x100,
0250 0x9490, 0xffffffff, 0x8,
0251 0x949c, 0xffffffff, 0x100,
0252 0x9490, 0xffffffff, 0x9,
0253 0x949c, 0xffffffff, 0x100,
0254 0x9490, 0xffffffff, 0x8000,
0255 0x9604, 0xffffffff, 0x0,
0256 0x9654, 0xffffffff, 0x100,
0257 0x9604, 0xffffffff, 0x1,
0258 0x9654, 0xffffffff, 0x100,
0259 0x9604, 0xffffffff, 0x2,
0260 0x9654, 0xffffffff, 0x100,
0261 0x9604, 0xffffffff, 0x3,
0262 0x9654, 0xffffffff, 0x100,
0263 0x9604, 0xffffffff, 0x4,
0264 0x9654, 0xffffffff, 0x100,
0265 0x9604, 0xffffffff, 0x5,
0266 0x9654, 0xffffffff, 0x100,
0267 0x9604, 0xffffffff, 0x6,
0268 0x9654, 0xffffffff, 0x100,
0269 0x9604, 0xffffffff, 0x7,
0270 0x9654, 0xffffffff, 0x100,
0271 0x9604, 0xffffffff, 0x8,
0272 0x9654, 0xffffffff, 0x100,
0273 0x9604, 0xffffffff, 0x9,
0274 0x9654, 0xffffffff, 0x100,
0275 0x9604, 0xffffffff, 0x80000000,
0276 0x9030, 0xffffffff, 0x100,
0277 0x9034, 0xffffffff, 0x100,
0278 0x9038, 0xffffffff, 0x100,
0279 0x903c, 0xffffffff, 0x100,
0280 0x9040, 0xffffffff, 0x100,
0281 0xa200, 0xffffffff, 0x100,
0282 0xa204, 0xffffffff, 0x100,
0283 0xa208, 0xffffffff, 0x100,
0284 0xa20c, 0xffffffff, 0x100,
0285 0x971c, 0xffffffff, 0x100,
0286 0x915c, 0xffffffff, 0x00020001,
0287 0x9160, 0xffffffff, 0x00040003,
0288 0x916c, 0xffffffff, 0x00060005,
0289 0x9170, 0xffffffff, 0x00080007,
0290 0x9174, 0xffffffff, 0x000a0009,
0291 0x9178, 0xffffffff, 0x000c000b,
0292 0x917c, 0xffffffff, 0x000e000d,
0293 0x9180, 0xffffffff, 0x0010000f,
0294 0x918c, 0xffffffff, 0x00120011,
0295 0x9190, 0xffffffff, 0x00140013,
0296 0x9194, 0xffffffff, 0x00020001,
0297 0x9198, 0xffffffff, 0x00040003,
0298 0x919c, 0xffffffff, 0x00060005,
0299 0x91a8, 0xffffffff, 0x00080007,
0300 0x91ac, 0xffffffff, 0x000a0009,
0301 0x91b0, 0xffffffff, 0x000c000b,
0302 0x91b4, 0xffffffff, 0x000e000d,
0303 0x91b8, 0xffffffff, 0x0010000f,
0304 0x91c4, 0xffffffff, 0x00120011,
0305 0x91c8, 0xffffffff, 0x00140013,
0306 0x91cc, 0xffffffff, 0x00020001,
0307 0x91d0, 0xffffffff, 0x00040003,
0308 0x91d4, 0xffffffff, 0x00060005,
0309 0x91e0, 0xffffffff, 0x00080007,
0310 0x91e4, 0xffffffff, 0x000a0009,
0311 0x91e8, 0xffffffff, 0x000c000b,
0312 0x91ec, 0xffffffff, 0x00020001,
0313 0x91f0, 0xffffffff, 0x00040003,
0314 0x91f4, 0xffffffff, 0x00060005,
0315 0x9200, 0xffffffff, 0x00080007,
0316 0x9204, 0xffffffff, 0x000a0009,
0317 0x9208, 0xffffffff, 0x000c000b,
0318 0x920c, 0xffffffff, 0x000e000d,
0319 0x9210, 0xffffffff, 0x0010000f,
0320 0x921c, 0xffffffff, 0x00120011,
0321 0x9220, 0xffffffff, 0x00140013,
0322 0x9224, 0xffffffff, 0x00020001,
0323 0x9228, 0xffffffff, 0x00040003,
0324 0x922c, 0xffffffff, 0x00060005,
0325 0x9238, 0xffffffff, 0x00080007,
0326 0x923c, 0xffffffff, 0x000a0009,
0327 0x9240, 0xffffffff, 0x000c000b,
0328 0x9244, 0xffffffff, 0x000e000d,
0329 0x9248, 0xffffffff, 0x0010000f,
0330 0x9254, 0xffffffff, 0x00120011,
0331 0x9258, 0xffffffff, 0x00140013,
0332 0x925c, 0xffffffff, 0x00020001,
0333 0x9260, 0xffffffff, 0x00040003,
0334 0x9264, 0xffffffff, 0x00060005,
0335 0x9270, 0xffffffff, 0x00080007,
0336 0x9274, 0xffffffff, 0x000a0009,
0337 0x9278, 0xffffffff, 0x000c000b,
0338 0x927c, 0xffffffff, 0x000e000d,
0339 0x9280, 0xffffffff, 0x0010000f,
0340 0x928c, 0xffffffff, 0x00120011,
0341 0x9290, 0xffffffff, 0x00140013,
0342 0x9294, 0xffffffff, 0x00020001,
0343 0x929c, 0xffffffff, 0x00040003,
0344 0x92a0, 0xffffffff, 0x00060005,
0345 0x92a4, 0xffffffff, 0x00080007
0346 };
0347
0348 static const u32 rv710_golden_registers[] =
0349 {
0350 0x3f90, 0x00ff0000, 0x00fc0000,
0351 0x9148, 0x00ff0000, 0x00fc0000,
0352 0x3f94, 0x00ff0000, 0x00fc0000,
0353 0x914c, 0x00ff0000, 0x00fc0000,
0354 0xb4c, 0x00000020, 0x00000020,
0355 0xa180, 0xffffffff, 0x00003f3f
0356 };
0357
0358 static const u32 rv710_mgcg_init[] =
0359 {
0360 0x8bcc, 0xffffffff, 0x13030040,
0361 0x5448, 0xffffffff, 0x100,
0362 0x55e4, 0xffffffff, 0x100,
0363 0x160c, 0xffffffff, 0x100,
0364 0x5644, 0xffffffff, 0x100,
0365 0xc164, 0xffffffff, 0x100,
0366 0x8a18, 0xffffffff, 0x100,
0367 0x897c, 0xffffffff, 0x8000100,
0368 0x8b28, 0xffffffff, 0x3c000100,
0369 0x9144, 0xffffffff, 0x100,
0370 0x9a1c, 0xffffffff, 0x10000,
0371 0x9a50, 0xffffffff, 0x100,
0372 0x9a1c, 0xffffffff, 0x0,
0373 0x9870, 0xffffffff, 0x100,
0374 0x8d58, 0xffffffff, 0x100,
0375 0x9500, 0xffffffff, 0x0,
0376 0x9510, 0xffffffff, 0x100,
0377 0x9500, 0xffffffff, 0x1,
0378 0x9510, 0xffffffff, 0x100,
0379 0x9500, 0xffffffff, 0x8000,
0380 0x9490, 0xffffffff, 0x0,
0381 0x949c, 0xffffffff, 0x100,
0382 0x9490, 0xffffffff, 0x1,
0383 0x949c, 0xffffffff, 0x100,
0384 0x9490, 0xffffffff, 0x8000,
0385 0x9604, 0xffffffff, 0x0,
0386 0x9654, 0xffffffff, 0x100,
0387 0x9604, 0xffffffff, 0x1,
0388 0x9654, 0xffffffff, 0x100,
0389 0x9604, 0xffffffff, 0x80000000,
0390 0x9030, 0xffffffff, 0x100,
0391 0x9034, 0xffffffff, 0x100,
0392 0x9038, 0xffffffff, 0x100,
0393 0x903c, 0xffffffff, 0x100,
0394 0x9040, 0xffffffff, 0x100,
0395 0xa200, 0xffffffff, 0x100,
0396 0xa204, 0xffffffff, 0x100,
0397 0xa208, 0xffffffff, 0x100,
0398 0xa20c, 0xffffffff, 0x100,
0399 0x971c, 0xffffffff, 0x100,
0400 0x915c, 0xffffffff, 0x00020001,
0401 0x9174, 0xffffffff, 0x00000003,
0402 0x9178, 0xffffffff, 0x00050001,
0403 0x917c, 0xffffffff, 0x00030002,
0404 0x918c, 0xffffffff, 0x00000004,
0405 0x9190, 0xffffffff, 0x00070006,
0406 0x9194, 0xffffffff, 0x00050001,
0407 0x9198, 0xffffffff, 0x00030002,
0408 0x91a8, 0xffffffff, 0x00000004,
0409 0x91ac, 0xffffffff, 0x00070006,
0410 0x91e8, 0xffffffff, 0x00000001,
0411 0x9294, 0xffffffff, 0x00000001,
0412 0x929c, 0xffffffff, 0x00000002,
0413 0x92a0, 0xffffffff, 0x00040003,
0414 0x9150, 0xffffffff, 0x4d940000
0415 };
0416
0417 static const u32 rv730_golden_registers[] =
0418 {
0419 0x3f90, 0x00ff0000, 0x00f00000,
0420 0x9148, 0x00ff0000, 0x00f00000,
0421 0x3f94, 0x00ff0000, 0x00f00000,
0422 0x914c, 0x00ff0000, 0x00f00000,
0423 0x900c, 0xffffffff, 0x003b033f,
0424 0xb4c, 0x00000020, 0x00000020,
0425 0xa180, 0xffffffff, 0x00003f3f
0426 };
0427
0428 static const u32 rv730_mgcg_init[] =
0429 {
0430 0x8bcc, 0xffffffff, 0x130300f9,
0431 0x5448, 0xffffffff, 0x100,
0432 0x55e4, 0xffffffff, 0x100,
0433 0x160c, 0xffffffff, 0x100,
0434 0x5644, 0xffffffff, 0x100,
0435 0xc164, 0xffffffff, 0x100,
0436 0x8a18, 0xffffffff, 0x100,
0437 0x897c, 0xffffffff, 0x8000100,
0438 0x8b28, 0xffffffff, 0x3c000100,
0439 0x9144, 0xffffffff, 0x100,
0440 0x9a1c, 0xffffffff, 0x10000,
0441 0x9a50, 0xffffffff, 0x100,
0442 0x9a1c, 0xffffffff, 0x10001,
0443 0x9a50, 0xffffffff, 0x100,
0444 0x9a1c, 0xffffffff, 0x0,
0445 0x9870, 0xffffffff, 0x100,
0446 0x8d58, 0xffffffff, 0x100,
0447 0x9500, 0xffffffff, 0x0,
0448 0x9510, 0xffffffff, 0x100,
0449 0x9500, 0xffffffff, 0x1,
0450 0x9510, 0xffffffff, 0x100,
0451 0x9500, 0xffffffff, 0x2,
0452 0x9510, 0xffffffff, 0x100,
0453 0x9500, 0xffffffff, 0x3,
0454 0x9510, 0xffffffff, 0x100,
0455 0x9500, 0xffffffff, 0x4,
0456 0x9510, 0xffffffff, 0x100,
0457 0x9500, 0xffffffff, 0x5,
0458 0x9510, 0xffffffff, 0x100,
0459 0x9500, 0xffffffff, 0x6,
0460 0x9510, 0xffffffff, 0x100,
0461 0x9500, 0xffffffff, 0x7,
0462 0x9510, 0xffffffff, 0x100,
0463 0x9500, 0xffffffff, 0x8000,
0464 0x9490, 0xffffffff, 0x0,
0465 0x949c, 0xffffffff, 0x100,
0466 0x9490, 0xffffffff, 0x1,
0467 0x949c, 0xffffffff, 0x100,
0468 0x9490, 0xffffffff, 0x2,
0469 0x949c, 0xffffffff, 0x100,
0470 0x9490, 0xffffffff, 0x3,
0471 0x949c, 0xffffffff, 0x100,
0472 0x9490, 0xffffffff, 0x4,
0473 0x949c, 0xffffffff, 0x100,
0474 0x9490, 0xffffffff, 0x5,
0475 0x949c, 0xffffffff, 0x100,
0476 0x9490, 0xffffffff, 0x6,
0477 0x949c, 0xffffffff, 0x100,
0478 0x9490, 0xffffffff, 0x7,
0479 0x949c, 0xffffffff, 0x100,
0480 0x9490, 0xffffffff, 0x8000,
0481 0x9604, 0xffffffff, 0x0,
0482 0x9654, 0xffffffff, 0x100,
0483 0x9604, 0xffffffff, 0x1,
0484 0x9654, 0xffffffff, 0x100,
0485 0x9604, 0xffffffff, 0x2,
0486 0x9654, 0xffffffff, 0x100,
0487 0x9604, 0xffffffff, 0x3,
0488 0x9654, 0xffffffff, 0x100,
0489 0x9604, 0xffffffff, 0x4,
0490 0x9654, 0xffffffff, 0x100,
0491 0x9604, 0xffffffff, 0x5,
0492 0x9654, 0xffffffff, 0x100,
0493 0x9604, 0xffffffff, 0x6,
0494 0x9654, 0xffffffff, 0x100,
0495 0x9604, 0xffffffff, 0x7,
0496 0x9654, 0xffffffff, 0x100,
0497 0x9604, 0xffffffff, 0x80000000,
0498 0x9030, 0xffffffff, 0x100,
0499 0x9034, 0xffffffff, 0x100,
0500 0x9038, 0xffffffff, 0x100,
0501 0x903c, 0xffffffff, 0x100,
0502 0x9040, 0xffffffff, 0x100,
0503 0xa200, 0xffffffff, 0x100,
0504 0xa204, 0xffffffff, 0x100,
0505 0xa208, 0xffffffff, 0x100,
0506 0xa20c, 0xffffffff, 0x100,
0507 0x971c, 0xffffffff, 0x100,
0508 0x915c, 0xffffffff, 0x00020001,
0509 0x916c, 0xffffffff, 0x00040003,
0510 0x9170, 0xffffffff, 0x00000005,
0511 0x9178, 0xffffffff, 0x00050001,
0512 0x917c, 0xffffffff, 0x00030002,
0513 0x918c, 0xffffffff, 0x00000004,
0514 0x9190, 0xffffffff, 0x00070006,
0515 0x9194, 0xffffffff, 0x00050001,
0516 0x9198, 0xffffffff, 0x00030002,
0517 0x91a8, 0xffffffff, 0x00000004,
0518 0x91ac, 0xffffffff, 0x00070006,
0519 0x91b0, 0xffffffff, 0x00050001,
0520 0x91b4, 0xffffffff, 0x00030002,
0521 0x91c4, 0xffffffff, 0x00000004,
0522 0x91c8, 0xffffffff, 0x00070006,
0523 0x91cc, 0xffffffff, 0x00050001,
0524 0x91d0, 0xffffffff, 0x00030002,
0525 0x91e0, 0xffffffff, 0x00000004,
0526 0x91e4, 0xffffffff, 0x00070006,
0527 0x91e8, 0xffffffff, 0x00000001,
0528 0x91ec, 0xffffffff, 0x00050001,
0529 0x91f0, 0xffffffff, 0x00030002,
0530 0x9200, 0xffffffff, 0x00000004,
0531 0x9204, 0xffffffff, 0x00070006,
0532 0x9208, 0xffffffff, 0x00050001,
0533 0x920c, 0xffffffff, 0x00030002,
0534 0x921c, 0xffffffff, 0x00000004,
0535 0x9220, 0xffffffff, 0x00070006,
0536 0x9224, 0xffffffff, 0x00050001,
0537 0x9228, 0xffffffff, 0x00030002,
0538 0x9238, 0xffffffff, 0x00000004,
0539 0x923c, 0xffffffff, 0x00070006,
0540 0x9240, 0xffffffff, 0x00050001,
0541 0x9244, 0xffffffff, 0x00030002,
0542 0x9254, 0xffffffff, 0x00000004,
0543 0x9258, 0xffffffff, 0x00070006,
0544 0x9294, 0xffffffff, 0x00000001,
0545 0x929c, 0xffffffff, 0x00000002,
0546 0x92a0, 0xffffffff, 0x00040003,
0547 0x92a4, 0xffffffff, 0x00000005
0548 };
0549
0550 static const u32 rv740_golden_registers[] =
0551 {
0552 0x88c4, 0xffffffff, 0x00000082,
0553 0x28a50, 0xfffffffc, 0x00000004,
0554 0x2650, 0x00040000, 0,
0555 0x20bc, 0x00040000, 0,
0556 0x733c, 0xffffffff, 0x00000002,
0557 0x7300, 0xffffffff, 0x001000f0,
0558 0x3f90, 0x00ff0000, 0,
0559 0x9148, 0x00ff0000, 0,
0560 0x3f94, 0x00ff0000, 0,
0561 0x914c, 0x00ff0000, 0,
0562 0x240c, 0xffffffff, 0x00000380,
0563 0x8a14, 0x00000007, 0x00000007,
0564 0x8b24, 0xffffffff, 0x00ff0fff,
0565 0x28a4c, 0xffffffff, 0x00004000,
0566 0xa180, 0xffffffff, 0x00003f3f,
0567 0x8d00, 0xffffffff, 0x0e0e003a,
0568 0x8d04, 0xffffffff, 0x013a0e2a,
0569 0x8c00, 0xffffffff, 0xe400000f,
0570 0x8db0, 0xffffffff, 0x98989898,
0571 0x8db4, 0xffffffff, 0x98989898,
0572 0x8db8, 0xffffffff, 0x98989898,
0573 0x8dbc, 0xffffffff, 0x98989898,
0574 0x8dc0, 0xffffffff, 0x98989898,
0575 0x8dc4, 0xffffffff, 0x98989898,
0576 0x8dc8, 0xffffffff, 0x98989898,
0577 0x8dcc, 0xffffffff, 0x98989898,
0578 0x9058, 0xffffffff, 0x0fffc40f,
0579 0x900c, 0xffffffff, 0x003b033f,
0580 0x28350, 0xffffffff, 0,
0581 0x8cf0, 0x1fffffff, 0x08e00420,
0582 0x9508, 0xffffffff, 0x00000002,
0583 0x88c4, 0xffffffff, 0x000000c2,
0584 0x9698, 0x18000000, 0x18000000
0585 };
0586
0587 static const u32 rv740_mgcg_init[] =
0588 {
0589 0x8bcc, 0xffffffff, 0x13030100,
0590 0x5448, 0xffffffff, 0x100,
0591 0x55e4, 0xffffffff, 0x100,
0592 0x160c, 0xffffffff, 0x100,
0593 0x5644, 0xffffffff, 0x100,
0594 0xc164, 0xffffffff, 0x100,
0595 0x8a18, 0xffffffff, 0x100,
0596 0x897c, 0xffffffff, 0x100,
0597 0x8b28, 0xffffffff, 0x100,
0598 0x9144, 0xffffffff, 0x100,
0599 0x9a1c, 0xffffffff, 0x10000,
0600 0x9a50, 0xffffffff, 0x100,
0601 0x9a1c, 0xffffffff, 0x10001,
0602 0x9a50, 0xffffffff, 0x100,
0603 0x9a1c, 0xffffffff, 0x10002,
0604 0x9a50, 0xffffffff, 0x100,
0605 0x9a1c, 0xffffffff, 0x10003,
0606 0x9a50, 0xffffffff, 0x100,
0607 0x9a1c, 0xffffffff, 0x0,
0608 0x9870, 0xffffffff, 0x100,
0609 0x8d58, 0xffffffff, 0x100,
0610 0x9500, 0xffffffff, 0x0,
0611 0x9510, 0xffffffff, 0x100,
0612 0x9500, 0xffffffff, 0x1,
0613 0x9510, 0xffffffff, 0x100,
0614 0x9500, 0xffffffff, 0x2,
0615 0x9510, 0xffffffff, 0x100,
0616 0x9500, 0xffffffff, 0x3,
0617 0x9510, 0xffffffff, 0x100,
0618 0x9500, 0xffffffff, 0x4,
0619 0x9510, 0xffffffff, 0x100,
0620 0x9500, 0xffffffff, 0x5,
0621 0x9510, 0xffffffff, 0x100,
0622 0x9500, 0xffffffff, 0x6,
0623 0x9510, 0xffffffff, 0x100,
0624 0x9500, 0xffffffff, 0x7,
0625 0x9510, 0xffffffff, 0x100,
0626 0x9500, 0xffffffff, 0x8000,
0627 0x9490, 0xffffffff, 0x0,
0628 0x949c, 0xffffffff, 0x100,
0629 0x9490, 0xffffffff, 0x1,
0630 0x949c, 0xffffffff, 0x100,
0631 0x9490, 0xffffffff, 0x2,
0632 0x949c, 0xffffffff, 0x100,
0633 0x9490, 0xffffffff, 0x3,
0634 0x949c, 0xffffffff, 0x100,
0635 0x9490, 0xffffffff, 0x4,
0636 0x949c, 0xffffffff, 0x100,
0637 0x9490, 0xffffffff, 0x5,
0638 0x949c, 0xffffffff, 0x100,
0639 0x9490, 0xffffffff, 0x6,
0640 0x949c, 0xffffffff, 0x100,
0641 0x9490, 0xffffffff, 0x7,
0642 0x949c, 0xffffffff, 0x100,
0643 0x9490, 0xffffffff, 0x8000,
0644 0x9604, 0xffffffff, 0x0,
0645 0x9654, 0xffffffff, 0x100,
0646 0x9604, 0xffffffff, 0x1,
0647 0x9654, 0xffffffff, 0x100,
0648 0x9604, 0xffffffff, 0x2,
0649 0x9654, 0xffffffff, 0x100,
0650 0x9604, 0xffffffff, 0x3,
0651 0x9654, 0xffffffff, 0x100,
0652 0x9604, 0xffffffff, 0x4,
0653 0x9654, 0xffffffff, 0x100,
0654 0x9604, 0xffffffff, 0x5,
0655 0x9654, 0xffffffff, 0x100,
0656 0x9604, 0xffffffff, 0x6,
0657 0x9654, 0xffffffff, 0x100,
0658 0x9604, 0xffffffff, 0x7,
0659 0x9654, 0xffffffff, 0x100,
0660 0x9604, 0xffffffff, 0x80000000,
0661 0x9030, 0xffffffff, 0x100,
0662 0x9034, 0xffffffff, 0x100,
0663 0x9038, 0xffffffff, 0x100,
0664 0x903c, 0xffffffff, 0x100,
0665 0x9040, 0xffffffff, 0x100,
0666 0xa200, 0xffffffff, 0x100,
0667 0xa204, 0xffffffff, 0x100,
0668 0xa208, 0xffffffff, 0x100,
0669 0xa20c, 0xffffffff, 0x100,
0670 0x971c, 0xffffffff, 0x100,
0671 0x915c, 0xffffffff, 0x00020001,
0672 0x9160, 0xffffffff, 0x00040003,
0673 0x916c, 0xffffffff, 0x00060005,
0674 0x9170, 0xffffffff, 0x00080007,
0675 0x9174, 0xffffffff, 0x000a0009,
0676 0x9178, 0xffffffff, 0x000c000b,
0677 0x917c, 0xffffffff, 0x000e000d,
0678 0x9180, 0xffffffff, 0x0010000f,
0679 0x918c, 0xffffffff, 0x00120011,
0680 0x9190, 0xffffffff, 0x00140013,
0681 0x9194, 0xffffffff, 0x00020001,
0682 0x9198, 0xffffffff, 0x00040003,
0683 0x919c, 0xffffffff, 0x00060005,
0684 0x91a8, 0xffffffff, 0x00080007,
0685 0x91ac, 0xffffffff, 0x000a0009,
0686 0x91b0, 0xffffffff, 0x000c000b,
0687 0x91b4, 0xffffffff, 0x000e000d,
0688 0x91b8, 0xffffffff, 0x0010000f,
0689 0x91c4, 0xffffffff, 0x00120011,
0690 0x91c8, 0xffffffff, 0x00140013,
0691 0x91cc, 0xffffffff, 0x00020001,
0692 0x91d0, 0xffffffff, 0x00040003,
0693 0x91d4, 0xffffffff, 0x00060005,
0694 0x91e0, 0xffffffff, 0x00080007,
0695 0x91e4, 0xffffffff, 0x000a0009,
0696 0x91e8, 0xffffffff, 0x000c000b,
0697 0x91ec, 0xffffffff, 0x00020001,
0698 0x91f0, 0xffffffff, 0x00040003,
0699 0x91f4, 0xffffffff, 0x00060005,
0700 0x9200, 0xffffffff, 0x00080007,
0701 0x9204, 0xffffffff, 0x000a0009,
0702 0x9208, 0xffffffff, 0x000c000b,
0703 0x920c, 0xffffffff, 0x000e000d,
0704 0x9210, 0xffffffff, 0x0010000f,
0705 0x921c, 0xffffffff, 0x00120011,
0706 0x9220, 0xffffffff, 0x00140013,
0707 0x9224, 0xffffffff, 0x00020001,
0708 0x9228, 0xffffffff, 0x00040003,
0709 0x922c, 0xffffffff, 0x00060005,
0710 0x9238, 0xffffffff, 0x00080007,
0711 0x923c, 0xffffffff, 0x000a0009,
0712 0x9240, 0xffffffff, 0x000c000b,
0713 0x9244, 0xffffffff, 0x000e000d,
0714 0x9248, 0xffffffff, 0x0010000f,
0715 0x9254, 0xffffffff, 0x00120011,
0716 0x9258, 0xffffffff, 0x00140013,
0717 0x9294, 0xffffffff, 0x00020001,
0718 0x929c, 0xffffffff, 0x00040003,
0719 0x92a0, 0xffffffff, 0x00060005,
0720 0x92a4, 0xffffffff, 0x00080007
0721 };
0722
0723 static void rv770_init_golden_registers(struct radeon_device *rdev)
0724 {
0725 switch (rdev->family) {
0726 case CHIP_RV770:
0727 radeon_program_register_sequence(rdev,
0728 r7xx_golden_registers,
0729 (const u32)ARRAY_SIZE(r7xx_golden_registers));
0730 radeon_program_register_sequence(rdev,
0731 r7xx_golden_dyn_gpr_registers,
0732 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
0733 if (rdev->pdev->device == 0x994e)
0734 radeon_program_register_sequence(rdev,
0735 rv770ce_golden_registers,
0736 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
0737 else
0738 radeon_program_register_sequence(rdev,
0739 rv770_golden_registers,
0740 (const u32)ARRAY_SIZE(rv770_golden_registers));
0741 radeon_program_register_sequence(rdev,
0742 rv770_mgcg_init,
0743 (const u32)ARRAY_SIZE(rv770_mgcg_init));
0744 break;
0745 case CHIP_RV730:
0746 radeon_program_register_sequence(rdev,
0747 r7xx_golden_registers,
0748 (const u32)ARRAY_SIZE(r7xx_golden_registers));
0749 radeon_program_register_sequence(rdev,
0750 r7xx_golden_dyn_gpr_registers,
0751 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
0752 radeon_program_register_sequence(rdev,
0753 rv730_golden_registers,
0754 (const u32)ARRAY_SIZE(rv730_golden_registers));
0755 radeon_program_register_sequence(rdev,
0756 rv730_mgcg_init,
0757 (const u32)ARRAY_SIZE(rv730_mgcg_init));
0758 break;
0759 case CHIP_RV710:
0760 radeon_program_register_sequence(rdev,
0761 r7xx_golden_registers,
0762 (const u32)ARRAY_SIZE(r7xx_golden_registers));
0763 radeon_program_register_sequence(rdev,
0764 r7xx_golden_dyn_gpr_registers,
0765 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
0766 radeon_program_register_sequence(rdev,
0767 rv710_golden_registers,
0768 (const u32)ARRAY_SIZE(rv710_golden_registers));
0769 radeon_program_register_sequence(rdev,
0770 rv710_mgcg_init,
0771 (const u32)ARRAY_SIZE(rv710_mgcg_init));
0772 break;
0773 case CHIP_RV740:
0774 radeon_program_register_sequence(rdev,
0775 rv740_golden_registers,
0776 (const u32)ARRAY_SIZE(rv740_golden_registers));
0777 radeon_program_register_sequence(rdev,
0778 rv740_mgcg_init,
0779 (const u32)ARRAY_SIZE(rv740_mgcg_init));
0780 break;
0781 default:
0782 break;
0783 }
0784 }
0785
0786 #define PCIE_BUS_CLK 10000
0787 #define TCLK (PCIE_BUS_CLK / 10)
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797 u32 rv770_get_xclk(struct radeon_device *rdev)
0798 {
0799 u32 reference_clock = rdev->clock.spll.reference_freq;
0800 u32 tmp = RREG32(CG_CLKPIN_CNTL);
0801
0802 if (tmp & MUX_TCLK_TO_XCLK)
0803 return TCLK;
0804
0805 if (tmp & XTALIN_DIVIDE)
0806 return reference_clock / 4;
0807
0808 return reference_clock;
0809 }
0810
0811 void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
0812 {
0813 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
0814 struct drm_framebuffer *fb = radeon_crtc->base.primary->fb;
0815 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
0816 int i;
0817
0818
0819 tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
0820 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
0821
0822
0823 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
0824 async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
0825
0826 WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset,
0827 fb->pitches[0] / fb->format->cpp[0]);
0828
0829 if (radeon_crtc->crtc_id) {
0830 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
0831 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
0832 } else {
0833 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
0834 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
0835 }
0836 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
0837 (u32)crtc_base);
0838 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
0839 (u32)crtc_base);
0840
0841
0842 for (i = 0; i < rdev->usec_timeout; i++) {
0843 if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
0844 break;
0845 udelay(1);
0846 }
0847 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
0848
0849
0850 tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
0851 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
0852 }
0853
0854 bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
0855 {
0856 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
0857
0858
0859 return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
0860 AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
0861 }
0862
0863
0864 int rv770_get_temp(struct radeon_device *rdev)
0865 {
0866 u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
0867 ASIC_T_SHIFT;
0868 int actual_temp;
0869
0870 if (temp & 0x400)
0871 actual_temp = -256;
0872 else if (temp & 0x200)
0873 actual_temp = 255;
0874 else if (temp & 0x100) {
0875 actual_temp = temp & 0x1ff;
0876 actual_temp |= ~0x1ff;
0877 } else
0878 actual_temp = temp & 0xff;
0879
0880 return (actual_temp * 1000) / 2;
0881 }
0882
0883 void rv770_pm_misc(struct radeon_device *rdev)
0884 {
0885 int req_ps_idx = rdev->pm.requested_power_state_index;
0886 int req_cm_idx = rdev->pm.requested_clock_mode_index;
0887 struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
0888 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
0889
0890 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
0891
0892 if (voltage->voltage == 0xff01)
0893 return;
0894 if (voltage->voltage != rdev->pm.current_vddc) {
0895 radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
0896 rdev->pm.current_vddc = voltage->voltage;
0897 DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
0898 }
0899 }
0900 }
0901
0902
0903
0904
0905 static int rv770_pcie_gart_enable(struct radeon_device *rdev)
0906 {
0907 u32 tmp;
0908 int r, i;
0909
0910 if (rdev->gart.robj == NULL) {
0911 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
0912 return -EINVAL;
0913 }
0914 r = radeon_gart_table_vram_pin(rdev);
0915 if (r)
0916 return r;
0917
0918 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
0919 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
0920 EFFECTIVE_L2_QUEUE_SIZE(7));
0921 WREG32(VM_L2_CNTL2, 0);
0922 WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
0923
0924 tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
0925 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
0926 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
0927 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
0928 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
0929 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
0930 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
0931 if (rdev->family == CHIP_RV740)
0932 WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
0933 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
0934 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
0935 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
0936 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
0937 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
0938 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
0939 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
0940 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
0941 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
0942 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
0943 (u32)(rdev->dummy_page.addr >> 12));
0944 for (i = 1; i < 7; i++)
0945 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
0946
0947 r600_pcie_gart_tlb_flush(rdev);
0948 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
0949 (unsigned)(rdev->mc.gtt_size >> 20),
0950 (unsigned long long)rdev->gart.table_addr);
0951 rdev->gart.ready = true;
0952 return 0;
0953 }
0954
0955 static void rv770_pcie_gart_disable(struct radeon_device *rdev)
0956 {
0957 u32 tmp;
0958 int i;
0959
0960
0961 for (i = 0; i < 7; i++)
0962 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
0963
0964
0965 WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
0966 EFFECTIVE_L2_QUEUE_SIZE(7));
0967 WREG32(VM_L2_CNTL2, 0);
0968 WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
0969
0970 tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
0971 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
0972 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
0973 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
0974 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
0975 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
0976 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
0977 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
0978 radeon_gart_table_vram_unpin(rdev);
0979 }
0980
0981 static void rv770_pcie_gart_fini(struct radeon_device *rdev)
0982 {
0983 radeon_gart_fini(rdev);
0984 rv770_pcie_gart_disable(rdev);
0985 radeon_gart_table_vram_free(rdev);
0986 }
0987
0988
0989 static void rv770_agp_enable(struct radeon_device *rdev)
0990 {
0991 u32 tmp;
0992 int i;
0993
0994
0995 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
0996 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
0997 EFFECTIVE_L2_QUEUE_SIZE(7));
0998 WREG32(VM_L2_CNTL2, 0);
0999 WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
1000
1001 tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
1002 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1003 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
1004 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
1005 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
1006 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
1007 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
1008 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
1009 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
1010 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1011 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1012 for (i = 0; i < 7; i++)
1013 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1014 }
1015
1016 static void rv770_mc_program(struct radeon_device *rdev)
1017 {
1018 struct rv515_mc_save save;
1019 u32 tmp;
1020 int i, j;
1021
1022
1023 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1024 WREG32((0x2c14 + j), 0x00000000);
1025 WREG32((0x2c18 + j), 0x00000000);
1026 WREG32((0x2c1c + j), 0x00000000);
1027 WREG32((0x2c20 + j), 0x00000000);
1028 WREG32((0x2c24 + j), 0x00000000);
1029 }
1030
1031
1032
1033 tmp = RREG32(HDP_DEBUG1);
1034
1035 rv515_mc_stop(rdev, &save);
1036 if (r600_mc_wait_for_idle(rdev)) {
1037 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1038 }
1039
1040 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1041
1042 if (rdev->flags & RADEON_IS_AGP) {
1043 if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1044
1045 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1046 rdev->mc.vram_start >> 12);
1047 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1048 rdev->mc.gtt_end >> 12);
1049 } else {
1050
1051 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1052 rdev->mc.gtt_start >> 12);
1053 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1054 rdev->mc.vram_end >> 12);
1055 }
1056 } else {
1057 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1058 rdev->mc.vram_start >> 12);
1059 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1060 rdev->mc.vram_end >> 12);
1061 }
1062 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1063 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1064 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1065 WREG32(MC_VM_FB_LOCATION, tmp);
1066 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1067 WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1068 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1069 if (rdev->flags & RADEON_IS_AGP) {
1070 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1071 WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1072 WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1073 } else {
1074 WREG32(MC_VM_AGP_BASE, 0);
1075 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1076 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1077 }
1078 if (r600_mc_wait_for_idle(rdev)) {
1079 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1080 }
1081 rv515_mc_resume(rdev, &save);
1082
1083
1084 rv515_vga_render_disable(rdev);
1085 }
1086
1087
1088
1089
1090
1091 void r700_cp_stop(struct radeon_device *rdev)
1092 {
1093 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1094 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1095 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1096 WREG32(SCRATCH_UMSK, 0);
1097 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1098 }
1099
1100 static int rv770_cp_load_microcode(struct radeon_device *rdev)
1101 {
1102 const __be32 *fw_data;
1103 int i;
1104
1105 if (!rdev->me_fw || !rdev->pfp_fw)
1106 return -EINVAL;
1107
1108 r700_cp_stop(rdev);
1109 WREG32(CP_RB_CNTL,
1110 #ifdef __BIG_ENDIAN
1111 BUF_SWAP_32BIT |
1112 #endif
1113 RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1114
1115
1116 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1117 RREG32(GRBM_SOFT_RESET);
1118 mdelay(15);
1119 WREG32(GRBM_SOFT_RESET, 0);
1120
1121 fw_data = (const __be32 *)rdev->pfp_fw->data;
1122 WREG32(CP_PFP_UCODE_ADDR, 0);
1123 for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1124 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1125 WREG32(CP_PFP_UCODE_ADDR, 0);
1126
1127 fw_data = (const __be32 *)rdev->me_fw->data;
1128 WREG32(CP_ME_RAM_WADDR, 0);
1129 for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1130 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1131
1132 WREG32(CP_PFP_UCODE_ADDR, 0);
1133 WREG32(CP_ME_RAM_WADDR, 0);
1134 WREG32(CP_ME_RAM_RADDR, 0);
1135 return 0;
1136 }
1137
1138 void r700_cp_fini(struct radeon_device *rdev)
1139 {
1140 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1141 r700_cp_stop(rdev);
1142 radeon_ring_fini(rdev, ring);
1143 radeon_scratch_free(rdev, ring->rptr_save_reg);
1144 }
1145
1146 void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1147 {
1148 u32 tmp, i;
1149
1150 if (rdev->flags & RADEON_IS_IGP)
1151 return;
1152
1153 tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1154 tmp &= SCLK_MUX_SEL_MASK;
1155 tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1156 WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1157
1158 for (i = 0; i < rdev->usec_timeout; i++) {
1159 if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1160 break;
1161 udelay(1);
1162 }
1163
1164 tmp &= ~SCLK_MUX_UPDATE;
1165 WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1166
1167 tmp = RREG32(MPLL_CNTL_MODE);
1168 if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1169 tmp &= ~RV730_MPLL_MCLK_SEL;
1170 else
1171 tmp &= ~MPLL_MCLK_SEL;
1172 WREG32(MPLL_CNTL_MODE, tmp);
1173 }
1174
1175
1176
1177
1178 static void rv770_gpu_init(struct radeon_device *rdev)
1179 {
1180 int i, j, num_qd_pipes;
1181 u32 ta_aux_cntl;
1182 u32 sx_debug_1;
1183 u32 smx_dc_ctl0;
1184 u32 db_debug3;
1185 u32 num_gs_verts_per_thread;
1186 u32 vgt_gs_per_es;
1187 u32 gs_prim_buffer_depth = 0;
1188 u32 sq_ms_fifo_sizes;
1189 u32 sq_config;
1190 u32 sq_thread_resource_mgmt;
1191 u32 hdp_host_path_cntl;
1192 u32 sq_dyn_gpr_size_simd_ab_0;
1193 u32 gb_tiling_config = 0;
1194 u32 cc_gc_shader_pipe_config = 0;
1195 u32 mc_arb_ramcfg;
1196 u32 db_debug4, tmp;
1197 u32 inactive_pipes, shader_pipe_config;
1198 u32 disabled_rb_mask;
1199 unsigned active_number;
1200
1201
1202 rdev->config.rv770.tiling_group_size = 256;
1203 switch (rdev->family) {
1204 case CHIP_RV770:
1205 rdev->config.rv770.max_pipes = 4;
1206 rdev->config.rv770.max_tile_pipes = 8;
1207 rdev->config.rv770.max_simds = 10;
1208 rdev->config.rv770.max_backends = 4;
1209 rdev->config.rv770.max_gprs = 256;
1210 rdev->config.rv770.max_threads = 248;
1211 rdev->config.rv770.max_stack_entries = 512;
1212 rdev->config.rv770.max_hw_contexts = 8;
1213 rdev->config.rv770.max_gs_threads = 16 * 2;
1214 rdev->config.rv770.sx_max_export_size = 128;
1215 rdev->config.rv770.sx_max_export_pos_size = 16;
1216 rdev->config.rv770.sx_max_export_smx_size = 112;
1217 rdev->config.rv770.sq_num_cf_insts = 2;
1218
1219 rdev->config.rv770.sx_num_of_sets = 7;
1220 rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1221 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1222 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1223 break;
1224 case CHIP_RV730:
1225 rdev->config.rv770.max_pipes = 2;
1226 rdev->config.rv770.max_tile_pipes = 4;
1227 rdev->config.rv770.max_simds = 8;
1228 rdev->config.rv770.max_backends = 2;
1229 rdev->config.rv770.max_gprs = 128;
1230 rdev->config.rv770.max_threads = 248;
1231 rdev->config.rv770.max_stack_entries = 256;
1232 rdev->config.rv770.max_hw_contexts = 8;
1233 rdev->config.rv770.max_gs_threads = 16 * 2;
1234 rdev->config.rv770.sx_max_export_size = 256;
1235 rdev->config.rv770.sx_max_export_pos_size = 32;
1236 rdev->config.rv770.sx_max_export_smx_size = 224;
1237 rdev->config.rv770.sq_num_cf_insts = 2;
1238
1239 rdev->config.rv770.sx_num_of_sets = 7;
1240 rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1241 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1242 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1243 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1244 rdev->config.rv770.sx_max_export_pos_size -= 16;
1245 rdev->config.rv770.sx_max_export_smx_size += 16;
1246 }
1247 break;
1248 case CHIP_RV710:
1249 rdev->config.rv770.max_pipes = 2;
1250 rdev->config.rv770.max_tile_pipes = 2;
1251 rdev->config.rv770.max_simds = 2;
1252 rdev->config.rv770.max_backends = 1;
1253 rdev->config.rv770.max_gprs = 256;
1254 rdev->config.rv770.max_threads = 192;
1255 rdev->config.rv770.max_stack_entries = 256;
1256 rdev->config.rv770.max_hw_contexts = 4;
1257 rdev->config.rv770.max_gs_threads = 8 * 2;
1258 rdev->config.rv770.sx_max_export_size = 128;
1259 rdev->config.rv770.sx_max_export_pos_size = 16;
1260 rdev->config.rv770.sx_max_export_smx_size = 112;
1261 rdev->config.rv770.sq_num_cf_insts = 1;
1262
1263 rdev->config.rv770.sx_num_of_sets = 7;
1264 rdev->config.rv770.sc_prim_fifo_size = 0x40;
1265 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1266 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1267 break;
1268 case CHIP_RV740:
1269 rdev->config.rv770.max_pipes = 4;
1270 rdev->config.rv770.max_tile_pipes = 4;
1271 rdev->config.rv770.max_simds = 8;
1272 rdev->config.rv770.max_backends = 4;
1273 rdev->config.rv770.max_gprs = 256;
1274 rdev->config.rv770.max_threads = 248;
1275 rdev->config.rv770.max_stack_entries = 512;
1276 rdev->config.rv770.max_hw_contexts = 8;
1277 rdev->config.rv770.max_gs_threads = 16 * 2;
1278 rdev->config.rv770.sx_max_export_size = 256;
1279 rdev->config.rv770.sx_max_export_pos_size = 32;
1280 rdev->config.rv770.sx_max_export_smx_size = 224;
1281 rdev->config.rv770.sq_num_cf_insts = 2;
1282
1283 rdev->config.rv770.sx_num_of_sets = 7;
1284 rdev->config.rv770.sc_prim_fifo_size = 0x100;
1285 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1286 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1287
1288 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1289 rdev->config.rv770.sx_max_export_pos_size -= 16;
1290 rdev->config.rv770.sx_max_export_smx_size += 16;
1291 }
1292 break;
1293 default:
1294 break;
1295 }
1296
1297
1298 j = 0;
1299 for (i = 0; i < 32; i++) {
1300 WREG32((0x2c14 + j), 0x00000000);
1301 WREG32((0x2c18 + j), 0x00000000);
1302 WREG32((0x2c1c + j), 0x00000000);
1303 WREG32((0x2c20 + j), 0x00000000);
1304 WREG32((0x2c24 + j), 0x00000000);
1305 j += 0x18;
1306 }
1307
1308 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1309
1310
1311 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1312
1313 shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1314 inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1315 for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1316 if (!(inactive_pipes & tmp)) {
1317 active_number++;
1318 }
1319 tmp <<= 1;
1320 }
1321 if (active_number == 1) {
1322 WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1323 } else {
1324 WREG32(SPI_CONFIG_CNTL, 0);
1325 }
1326
1327 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1328 tmp = rdev->config.rv770.max_simds -
1329 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1330 rdev->config.rv770.active_simds = tmp;
1331
1332 switch (rdev->config.rv770.max_tile_pipes) {
1333 case 1:
1334 default:
1335 gb_tiling_config = PIPE_TILING(0);
1336 break;
1337 case 2:
1338 gb_tiling_config = PIPE_TILING(1);
1339 break;
1340 case 4:
1341 gb_tiling_config = PIPE_TILING(2);
1342 break;
1343 case 8:
1344 gb_tiling_config = PIPE_TILING(3);
1345 break;
1346 }
1347 rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1348
1349 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1350 tmp = 0;
1351 for (i = 0; i < rdev->config.rv770.max_backends; i++)
1352 tmp |= (1 << i);
1353
1354 if ((disabled_rb_mask & tmp) == tmp) {
1355 for (i = 0; i < rdev->config.rv770.max_backends; i++)
1356 disabled_rb_mask &= ~(1 << i);
1357 }
1358 tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1359 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1360 R7XX_MAX_BACKENDS, disabled_rb_mask);
1361 gb_tiling_config |= tmp << 16;
1362 rdev->config.rv770.backend_map = tmp;
1363
1364 if (rdev->family == CHIP_RV770)
1365 gb_tiling_config |= BANK_TILING(1);
1366 else {
1367 if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1368 gb_tiling_config |= BANK_TILING(1);
1369 else
1370 gb_tiling_config |= BANK_TILING(0);
1371 }
1372 rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1373 gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1374 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1375 gb_tiling_config |= ROW_TILING(3);
1376 gb_tiling_config |= SAMPLE_SPLIT(3);
1377 } else {
1378 gb_tiling_config |=
1379 ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1380 gb_tiling_config |=
1381 SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1382 }
1383
1384 gb_tiling_config |= BANK_SWAPS(1);
1385 rdev->config.rv770.tile_config = gb_tiling_config;
1386
1387 WREG32(GB_TILING_CONFIG, gb_tiling_config);
1388 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1389 WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1390 WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1391 WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1392 if (rdev->family == CHIP_RV730) {
1393 WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1394 WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1395 WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1396 }
1397
1398 WREG32(CGTS_SYS_TCC_DISABLE, 0);
1399 WREG32(CGTS_TCC_DISABLE, 0);
1400 WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1401 WREG32(CGTS_USER_TCC_DISABLE, 0);
1402
1403
1404 num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1405 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1406 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1407
1408
1409 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1410 ROQ_IB2_START(0x2b)));
1411
1412 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1413
1414 ta_aux_cntl = RREG32(TA_CNTL_AUX);
1415 WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1416
1417 sx_debug_1 = RREG32(SX_DEBUG_1);
1418 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1419 WREG32(SX_DEBUG_1, sx_debug_1);
1420
1421 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1422 smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1423 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1424 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1425
1426 if (rdev->family != CHIP_RV740)
1427 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1428 GS_FLUSH_CTL(4) |
1429 ACK_FLUSH_CTL(3) |
1430 SYNC_FLUSH_CTL));
1431
1432 if (rdev->family != CHIP_RV770)
1433 WREG32(SMX_SAR_CTL0, 0x00003f3f);
1434
1435 db_debug3 = RREG32(DB_DEBUG3);
1436 db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1437 switch (rdev->family) {
1438 case CHIP_RV770:
1439 case CHIP_RV740:
1440 db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1441 break;
1442 case CHIP_RV710:
1443 case CHIP_RV730:
1444 default:
1445 db_debug3 |= DB_CLK_OFF_DELAY(2);
1446 break;
1447 }
1448 WREG32(DB_DEBUG3, db_debug3);
1449
1450 if (rdev->family != CHIP_RV770) {
1451 db_debug4 = RREG32(DB_DEBUG4);
1452 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1453 WREG32(DB_DEBUG4, db_debug4);
1454 }
1455
1456 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1457 POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1458 SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1459
1460 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1461 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1462 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1463
1464 WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1465
1466 WREG32(VGT_NUM_INSTANCES, 1);
1467
1468 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1469
1470 WREG32(CP_PERFMON_CNTL, 0);
1471
1472 sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1473 DONE_FIFO_HIWATER(0xe0) |
1474 ALU_UPDATE_FIFO_HIWATER(0x8));
1475 switch (rdev->family) {
1476 case CHIP_RV770:
1477 case CHIP_RV730:
1478 case CHIP_RV710:
1479 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1480 break;
1481 case CHIP_RV740:
1482 default:
1483 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1484 break;
1485 }
1486 WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1487
1488
1489
1490
1491 sq_config = RREG32(SQ_CONFIG);
1492 sq_config &= ~(PS_PRIO(3) |
1493 VS_PRIO(3) |
1494 GS_PRIO(3) |
1495 ES_PRIO(3));
1496 sq_config |= (DX9_CONSTS |
1497 VC_ENABLE |
1498 EXPORT_SRC_C |
1499 PS_PRIO(0) |
1500 VS_PRIO(1) |
1501 GS_PRIO(2) |
1502 ES_PRIO(3));
1503 if (rdev->family == CHIP_RV710)
1504
1505 sq_config &= ~VC_ENABLE;
1506
1507 WREG32(SQ_CONFIG, sq_config);
1508
1509 WREG32(SQ_GPR_RESOURCE_MGMT_1, (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1510 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1511 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1512
1513 WREG32(SQ_GPR_RESOURCE_MGMT_2, (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1514 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1515
1516 sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1517 NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1518 NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1519 if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1520 sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1521 else
1522 sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1523 WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1524
1525 WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1526 NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1527
1528 WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1529 NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1530
1531 sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1532 SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1533 SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1534 SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1535
1536 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1537 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1538 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1539 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1540 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1541 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1542 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1543 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1544
1545 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1546 FORCE_EOV_MAX_REZ_CNT(255)));
1547
1548 if (rdev->family == CHIP_RV710)
1549 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1550 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1551 else
1552 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1553 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1554
1555 switch (rdev->family) {
1556 case CHIP_RV770:
1557 case CHIP_RV730:
1558 case CHIP_RV740:
1559 gs_prim_buffer_depth = 384;
1560 break;
1561 case CHIP_RV710:
1562 gs_prim_buffer_depth = 128;
1563 break;
1564 default:
1565 break;
1566 }
1567
1568 num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1569 vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1570
1571 if (vgt_gs_per_es > 256)
1572 vgt_gs_per_es = 256;
1573
1574 WREG32(VGT_ES_PER_GS, 128);
1575 WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1576 WREG32(VGT_GS_PER_VS, 2);
1577
1578
1579 WREG32(VGT_GS_VERTEX_REUSE, 16);
1580 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1581 WREG32(VGT_STRMOUT_EN, 0);
1582 WREG32(SX_MISC, 0);
1583 WREG32(PA_SC_MODE_CNTL, 0);
1584 WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1585 WREG32(PA_SC_AA_CONFIG, 0);
1586 WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1587 WREG32(PA_SC_LINE_STIPPLE, 0);
1588 WREG32(SPI_INPUT_Z, 0);
1589 WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1590 WREG32(CB_COLOR7_FRAG, 0);
1591
1592
1593 WREG32(CB_COLOR0_BASE, 0);
1594 WREG32(CB_COLOR1_BASE, 0);
1595 WREG32(CB_COLOR2_BASE, 0);
1596 WREG32(CB_COLOR3_BASE, 0);
1597 WREG32(CB_COLOR4_BASE, 0);
1598 WREG32(CB_COLOR5_BASE, 0);
1599 WREG32(CB_COLOR6_BASE, 0);
1600 WREG32(CB_COLOR7_BASE, 0);
1601
1602 WREG32(TCP_CNTL, 0);
1603
1604 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1605 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1606
1607 WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1608
1609 WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1610 NUM_CLIP_SEQ(3)));
1611 WREG32(VC_ENHANCE, 0);
1612 }
1613
1614 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1615 {
1616 u64 size_bf, size_af;
1617
1618 if (mc->mc_vram_size > 0xE0000000) {
1619
1620 dev_warn(rdev->dev, "limiting VRAM\n");
1621 mc->real_vram_size = 0xE0000000;
1622 mc->mc_vram_size = 0xE0000000;
1623 }
1624 if (rdev->flags & RADEON_IS_AGP) {
1625 size_bf = mc->gtt_start;
1626 size_af = mc->mc_mask - mc->gtt_end;
1627 if (size_bf > size_af) {
1628 if (mc->mc_vram_size > size_bf) {
1629 dev_warn(rdev->dev, "limiting VRAM\n");
1630 mc->real_vram_size = size_bf;
1631 mc->mc_vram_size = size_bf;
1632 }
1633 mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1634 } else {
1635 if (mc->mc_vram_size > size_af) {
1636 dev_warn(rdev->dev, "limiting VRAM\n");
1637 mc->real_vram_size = size_af;
1638 mc->mc_vram_size = size_af;
1639 }
1640 mc->vram_start = mc->gtt_end + 1;
1641 }
1642 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1643 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1644 mc->mc_vram_size >> 20, mc->vram_start,
1645 mc->vram_end, mc->real_vram_size >> 20);
1646 } else {
1647 radeon_vram_location(rdev, &rdev->mc, 0);
1648 rdev->mc.gtt_base_align = 0;
1649 radeon_gtt_location(rdev, mc);
1650 }
1651 }
1652
1653 static int rv770_mc_init(struct radeon_device *rdev)
1654 {
1655 u32 tmp;
1656 int chansize, numchan;
1657
1658
1659 rdev->mc.vram_is_ddr = true;
1660 tmp = RREG32(MC_ARB_RAMCFG);
1661 if (tmp & CHANSIZE_OVERRIDE) {
1662 chansize = 16;
1663 } else if (tmp & CHANSIZE_MASK) {
1664 chansize = 64;
1665 } else {
1666 chansize = 32;
1667 }
1668 tmp = RREG32(MC_SHARED_CHMAP);
1669 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1670 case 0:
1671 default:
1672 numchan = 1;
1673 break;
1674 case 1:
1675 numchan = 2;
1676 break;
1677 case 2:
1678 numchan = 4;
1679 break;
1680 case 3:
1681 numchan = 8;
1682 break;
1683 }
1684 rdev->mc.vram_width = numchan * chansize;
1685
1686 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1687 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1688
1689 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1690 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1691 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1692 r700_vram_gtt_location(rdev, &rdev->mc);
1693 radeon_update_bandwidth_info(rdev);
1694
1695 return 0;
1696 }
1697
1698 static void rv770_uvd_init(struct radeon_device *rdev)
1699 {
1700 int r;
1701
1702 if (!rdev->has_uvd)
1703 return;
1704
1705 r = radeon_uvd_init(rdev);
1706 if (r) {
1707 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1708
1709
1710
1711
1712
1713
1714 rdev->has_uvd = false;
1715 return;
1716 }
1717 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1718 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
1719 }
1720
1721 static void rv770_uvd_start(struct radeon_device *rdev)
1722 {
1723 int r;
1724
1725 if (!rdev->has_uvd)
1726 return;
1727
1728 r = uvd_v2_2_resume(rdev);
1729 if (r) {
1730 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
1731 goto error;
1732 }
1733 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
1734 if (r) {
1735 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
1736 goto error;
1737 }
1738 return;
1739
1740 error:
1741 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1742 }
1743
1744 static void rv770_uvd_resume(struct radeon_device *rdev)
1745 {
1746 struct radeon_ring *ring;
1747 int r;
1748
1749 if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
1750 return;
1751
1752 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1753 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
1754 if (r) {
1755 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
1756 return;
1757 }
1758 r = uvd_v1_0_init(rdev);
1759 if (r) {
1760 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
1761 return;
1762 }
1763 }
1764
1765 static int rv770_startup(struct radeon_device *rdev)
1766 {
1767 struct radeon_ring *ring;
1768 int r;
1769
1770
1771 rv770_pcie_gen2_enable(rdev);
1772
1773
1774 r = r600_vram_scratch_init(rdev);
1775 if (r)
1776 return r;
1777
1778 rv770_mc_program(rdev);
1779
1780 if (rdev->flags & RADEON_IS_AGP) {
1781 rv770_agp_enable(rdev);
1782 } else {
1783 r = rv770_pcie_gart_enable(rdev);
1784 if (r)
1785 return r;
1786 }
1787
1788 rv770_gpu_init(rdev);
1789
1790
1791 r = radeon_wb_init(rdev);
1792 if (r)
1793 return r;
1794
1795 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1796 if (r) {
1797 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1798 return r;
1799 }
1800
1801 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1802 if (r) {
1803 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1804 return r;
1805 }
1806
1807 rv770_uvd_start(rdev);
1808
1809
1810 if (!rdev->irq.installed) {
1811 r = radeon_irq_kms_init(rdev);
1812 if (r)
1813 return r;
1814 }
1815
1816 r = r600_irq_init(rdev);
1817 if (r) {
1818 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1819 radeon_irq_kms_fini(rdev);
1820 return r;
1821 }
1822 r600_irq_set(rdev);
1823
1824 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1825 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1826 RADEON_CP_PACKET2);
1827 if (r)
1828 return r;
1829
1830 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1831 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1832 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1833 if (r)
1834 return r;
1835
1836 r = rv770_cp_load_microcode(rdev);
1837 if (r)
1838 return r;
1839 r = r600_cp_resume(rdev);
1840 if (r)
1841 return r;
1842
1843 r = r600_dma_resume(rdev);
1844 if (r)
1845 return r;
1846
1847 rv770_uvd_resume(rdev);
1848
1849 r = radeon_ib_pool_init(rdev);
1850 if (r) {
1851 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1852 return r;
1853 }
1854
1855 r = radeon_audio_init(rdev);
1856 if (r) {
1857 DRM_ERROR("radeon: audio init failed\n");
1858 return r;
1859 }
1860
1861 return 0;
1862 }
1863
1864 int rv770_resume(struct radeon_device *rdev)
1865 {
1866 int r;
1867
1868
1869
1870
1871
1872
1873 atom_asic_init(rdev->mode_info.atom_context);
1874
1875
1876 rv770_init_golden_registers(rdev);
1877
1878 if (rdev->pm.pm_method == PM_METHOD_DPM)
1879 radeon_pm_resume(rdev);
1880
1881 rdev->accel_working = true;
1882 r = rv770_startup(rdev);
1883 if (r) {
1884 DRM_ERROR("r600 startup failed on resume\n");
1885 rdev->accel_working = false;
1886 return r;
1887 }
1888
1889 return r;
1890
1891 }
1892
1893 int rv770_suspend(struct radeon_device *rdev)
1894 {
1895 radeon_pm_suspend(rdev);
1896 radeon_audio_fini(rdev);
1897 if (rdev->has_uvd) {
1898 radeon_uvd_suspend(rdev);
1899 uvd_v1_0_fini(rdev);
1900 }
1901 r700_cp_stop(rdev);
1902 r600_dma_stop(rdev);
1903 r600_irq_suspend(rdev);
1904 radeon_wb_disable(rdev);
1905 rv770_pcie_gart_disable(rdev);
1906
1907 return 0;
1908 }
1909
1910
1911
1912
1913
1914
1915
1916 int rv770_init(struct radeon_device *rdev)
1917 {
1918 int r;
1919
1920
1921 if (!radeon_get_bios(rdev)) {
1922 if (ASIC_IS_AVIVO(rdev))
1923 return -EINVAL;
1924 }
1925
1926 if (!rdev->is_atom_bios) {
1927 dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1928 return -EINVAL;
1929 }
1930 r = radeon_atombios_init(rdev);
1931 if (r)
1932 return r;
1933
1934 if (!radeon_card_posted(rdev)) {
1935 if (!rdev->bios) {
1936 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1937 return -EINVAL;
1938 }
1939 DRM_INFO("GPU not posted. posting now...\n");
1940 atom_asic_init(rdev->mode_info.atom_context);
1941 }
1942
1943 rv770_init_golden_registers(rdev);
1944
1945 r600_scratch_init(rdev);
1946
1947 radeon_surface_init(rdev);
1948
1949 radeon_get_clock_info(rdev->ddev);
1950
1951 radeon_fence_driver_init(rdev);
1952
1953 if (rdev->flags & RADEON_IS_AGP) {
1954 r = radeon_agp_init(rdev);
1955 if (r)
1956 radeon_agp_disable(rdev);
1957 }
1958 r = rv770_mc_init(rdev);
1959 if (r)
1960 return r;
1961
1962 r = radeon_bo_init(rdev);
1963 if (r)
1964 return r;
1965
1966 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1967 r = r600_init_microcode(rdev);
1968 if (r) {
1969 DRM_ERROR("Failed to load firmware!\n");
1970 return r;
1971 }
1972 }
1973
1974
1975 radeon_pm_init(rdev);
1976
1977 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1978 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1979
1980 rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1981 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1982
1983 rv770_uvd_init(rdev);
1984
1985 rdev->ih.ring_obj = NULL;
1986 r600_ih_ring_init(rdev, 64 * 1024);
1987
1988 r = r600_pcie_gart_init(rdev);
1989 if (r)
1990 return r;
1991
1992 rdev->accel_working = true;
1993 r = rv770_startup(rdev);
1994 if (r) {
1995 dev_err(rdev->dev, "disabling GPU acceleration\n");
1996 r700_cp_fini(rdev);
1997 r600_dma_fini(rdev);
1998 r600_irq_fini(rdev);
1999 radeon_wb_fini(rdev);
2000 radeon_ib_pool_fini(rdev);
2001 radeon_irq_kms_fini(rdev);
2002 rv770_pcie_gart_fini(rdev);
2003 rdev->accel_working = false;
2004 }
2005
2006 return 0;
2007 }
2008
2009 void rv770_fini(struct radeon_device *rdev)
2010 {
2011 radeon_pm_fini(rdev);
2012 r700_cp_fini(rdev);
2013 r600_dma_fini(rdev);
2014 r600_irq_fini(rdev);
2015 radeon_wb_fini(rdev);
2016 radeon_ib_pool_fini(rdev);
2017 radeon_irq_kms_fini(rdev);
2018 uvd_v1_0_fini(rdev);
2019 radeon_uvd_fini(rdev);
2020 rv770_pcie_gart_fini(rdev);
2021 r600_vram_scratch_fini(rdev);
2022 radeon_gem_fini(rdev);
2023 radeon_fence_driver_fini(rdev);
2024 radeon_agp_fini(rdev);
2025 radeon_bo_fini(rdev);
2026 radeon_atombios_fini(rdev);
2027 kfree(rdev->bios);
2028 rdev->bios = NULL;
2029 }
2030
2031 static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2032 {
2033 u32 link_width_cntl, lanes, speed_cntl, tmp;
2034 u16 link_cntl2;
2035
2036 if (radeon_pcie_gen2 == 0)
2037 return;
2038
2039 if (rdev->flags & RADEON_IS_IGP)
2040 return;
2041
2042 if (!(rdev->flags & RADEON_IS_PCIE))
2043 return;
2044
2045
2046 if (ASIC_IS_X2(rdev))
2047 return;
2048
2049 if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
2050 (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
2051 return;
2052
2053 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2054
2055
2056 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2057 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2058 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2059 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2060 if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2061 lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2062 link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2063 LC_RECONFIG_ARC_MISSING_ESCAPE);
2064 link_width_cntl |= lanes | LC_RECONFIG_NOW |
2065 LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2066 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2067 } else {
2068 link_width_cntl |= LC_UPCONFIGURE_DIS;
2069 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2070 }
2071
2072 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2073 if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2074 (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2075
2076 tmp = RREG32(0x541c);
2077 WREG32(0x541c, tmp | 0x8);
2078 WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2079 link_cntl2 = RREG16(0x4088);
2080 link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2081 link_cntl2 |= 0x2;
2082 WREG16(0x4088, link_cntl2);
2083 WREG32(MM_CFGREGS_CNTL, 0);
2084
2085 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2086 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2087 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2088
2089 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2090 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2091 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2092
2093 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2094 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2095 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2096
2097 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2098 speed_cntl |= LC_GEN2_EN_STRAP;
2099 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2100
2101 } else {
2102 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2103
2104 if (1)
2105 link_width_cntl |= LC_UPCONFIGURE_DIS;
2106 else
2107 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2108 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2109 }
2110 }