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 "radeon.h"
0030 #include "radeon_asic.h"
0031 #include "atom.h"
0032 #include "r520d.h"
0033
0034
0035
0036 int r520_mc_wait_for_idle(struct radeon_device *rdev)
0037 {
0038 unsigned i;
0039 uint32_t tmp;
0040
0041 for (i = 0; i < rdev->usec_timeout; i++) {
0042
0043 tmp = RREG32_MC(R520_MC_STATUS);
0044 if (tmp & R520_MC_STATUS_IDLE) {
0045 return 0;
0046 }
0047 udelay(1);
0048 }
0049 return -1;
0050 }
0051
0052 static void r520_gpu_init(struct radeon_device *rdev)
0053 {
0054 unsigned pipe_select_current, gb_pipe_select, tmp;
0055
0056 rv515_vga_render_disable(rdev);
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 if (rdev->family == CHIP_RV530) {
0079 WREG32(0x4128, 0xFF);
0080 }
0081 r420_pipes_init(rdev);
0082 gb_pipe_select = RREG32(R400_GB_PIPE_SELECT);
0083 tmp = RREG32(R300_DST_PIPE_CONFIG);
0084 pipe_select_current = (tmp >> 2) & 3;
0085 tmp = (1 << pipe_select_current) |
0086 (((gb_pipe_select >> 8) & 0xF) << 4);
0087 WREG32_PLL(0x000D, tmp);
0088 if (r520_mc_wait_for_idle(rdev)) {
0089 pr_warn("Failed to wait MC idle while programming pipes. Bad things might happen.\n");
0090 }
0091 }
0092
0093 static void r520_vram_get_type(struct radeon_device *rdev)
0094 {
0095 uint32_t tmp;
0096
0097 rdev->mc.vram_width = 128;
0098 rdev->mc.vram_is_ddr = true;
0099 tmp = RREG32_MC(R520_MC_CNTL0);
0100 switch ((tmp & R520_MEM_NUM_CHANNELS_MASK) >> R520_MEM_NUM_CHANNELS_SHIFT) {
0101 case 0:
0102 rdev->mc.vram_width = 32;
0103 break;
0104 case 1:
0105 rdev->mc.vram_width = 64;
0106 break;
0107 case 2:
0108 rdev->mc.vram_width = 128;
0109 break;
0110 case 3:
0111 rdev->mc.vram_width = 256;
0112 break;
0113 default:
0114 rdev->mc.vram_width = 128;
0115 break;
0116 }
0117 if (tmp & R520_MC_CHANNEL_SIZE)
0118 rdev->mc.vram_width *= 2;
0119 }
0120
0121 static void r520_mc_init(struct radeon_device *rdev)
0122 {
0123
0124 r520_vram_get_type(rdev);
0125 r100_vram_init_sizes(rdev);
0126 radeon_vram_location(rdev, &rdev->mc, 0);
0127 rdev->mc.gtt_base_align = 0;
0128 if (!(rdev->flags & RADEON_IS_AGP))
0129 radeon_gtt_location(rdev, &rdev->mc);
0130 radeon_update_bandwidth_info(rdev);
0131 }
0132
0133 static void r520_mc_program(struct radeon_device *rdev)
0134 {
0135 struct rv515_mc_save save;
0136
0137
0138 rv515_mc_stop(rdev, &save);
0139
0140
0141 if (r520_mc_wait_for_idle(rdev))
0142 dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
0143
0144 WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
0145
0146 WREG32_MC(R_000004_MC_FB_LOCATION,
0147 S_000004_MC_FB_START(rdev->mc.vram_start >> 16) |
0148 S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16));
0149 WREG32(R_000134_HDP_FB_LOCATION,
0150 S_000134_HDP_FB_START(rdev->mc.vram_start >> 16));
0151 if (rdev->flags & RADEON_IS_AGP) {
0152 WREG32_MC(R_000005_MC_AGP_LOCATION,
0153 S_000005_MC_AGP_START(rdev->mc.gtt_start >> 16) |
0154 S_000005_MC_AGP_TOP(rdev->mc.gtt_end >> 16));
0155 WREG32_MC(R_000006_AGP_BASE, lower_32_bits(rdev->mc.agp_base));
0156 WREG32_MC(R_000007_AGP_BASE_2,
0157 S_000007_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base)));
0158 } else {
0159 WREG32_MC(R_000005_MC_AGP_LOCATION, 0xFFFFFFFF);
0160 WREG32_MC(R_000006_AGP_BASE, 0);
0161 WREG32_MC(R_000007_AGP_BASE_2, 0);
0162 }
0163
0164 rv515_mc_resume(rdev, &save);
0165 }
0166
0167 static int r520_startup(struct radeon_device *rdev)
0168 {
0169 int r;
0170
0171 r520_mc_program(rdev);
0172
0173 rv515_clock_startup(rdev);
0174
0175 r520_gpu_init(rdev);
0176
0177
0178 if (rdev->flags & RADEON_IS_PCIE) {
0179 r = rv370_pcie_gart_enable(rdev);
0180 if (r)
0181 return r;
0182 }
0183
0184
0185 r = radeon_wb_init(rdev);
0186 if (r)
0187 return r;
0188
0189 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
0190 if (r) {
0191 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
0192 return r;
0193 }
0194
0195
0196 if (!rdev->irq.installed) {
0197 r = radeon_irq_kms_init(rdev);
0198 if (r)
0199 return r;
0200 }
0201
0202 rs600_irq_set(rdev);
0203 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
0204
0205 r = r100_cp_init(rdev, 1024 * 1024);
0206 if (r) {
0207 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
0208 return r;
0209 }
0210
0211 r = radeon_ib_pool_init(rdev);
0212 if (r) {
0213 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
0214 return r;
0215 }
0216
0217 return 0;
0218 }
0219
0220 int r520_resume(struct radeon_device *rdev)
0221 {
0222 int r;
0223
0224
0225 if (rdev->flags & RADEON_IS_PCIE)
0226 rv370_pcie_gart_disable(rdev);
0227
0228 rv515_clock_startup(rdev);
0229
0230 if (radeon_asic_reset(rdev)) {
0231 dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
0232 RREG32(R_000E40_RBBM_STATUS),
0233 RREG32(R_0007C0_CP_STAT));
0234 }
0235
0236 atom_asic_init(rdev->mode_info.atom_context);
0237
0238 rv515_clock_startup(rdev);
0239
0240 radeon_surface_init(rdev);
0241
0242 rdev->accel_working = true;
0243 r = r520_startup(rdev);
0244 if (r) {
0245 rdev->accel_working = false;
0246 }
0247 return r;
0248 }
0249
0250 int r520_init(struct radeon_device *rdev)
0251 {
0252 int r;
0253
0254
0255 radeon_scratch_init(rdev);
0256
0257 radeon_surface_init(rdev);
0258
0259 r100_restore_sanity(rdev);
0260
0261
0262 if (!radeon_get_bios(rdev)) {
0263 if (ASIC_IS_AVIVO(rdev))
0264 return -EINVAL;
0265 }
0266 if (rdev->is_atom_bios) {
0267 r = radeon_atombios_init(rdev);
0268 if (r)
0269 return r;
0270 } else {
0271 dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n");
0272 return -EINVAL;
0273 }
0274
0275 if (radeon_asic_reset(rdev)) {
0276 dev_warn(rdev->dev,
0277 "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
0278 RREG32(R_000E40_RBBM_STATUS),
0279 RREG32(R_0007C0_CP_STAT));
0280 }
0281
0282 if (radeon_boot_test_post_card(rdev) == false)
0283 return -EINVAL;
0284
0285 if (!radeon_card_posted(rdev) && rdev->bios) {
0286 DRM_INFO("GPU not posted. posting now...\n");
0287 atom_asic_init(rdev->mode_info.atom_context);
0288 }
0289
0290 radeon_get_clock_info(rdev->ddev);
0291
0292 if (rdev->flags & RADEON_IS_AGP) {
0293 r = radeon_agp_init(rdev);
0294 if (r) {
0295 radeon_agp_disable(rdev);
0296 }
0297 }
0298
0299 r520_mc_init(rdev);
0300 rv515_debugfs(rdev);
0301
0302 radeon_fence_driver_init(rdev);
0303
0304 r = radeon_bo_init(rdev);
0305 if (r)
0306 return r;
0307 r = rv370_pcie_gart_init(rdev);
0308 if (r)
0309 return r;
0310 rv515_set_safe_registers(rdev);
0311
0312
0313 radeon_pm_init(rdev);
0314
0315 rdev->accel_working = true;
0316 r = r520_startup(rdev);
0317 if (r) {
0318
0319 dev_err(rdev->dev, "Disabling GPU acceleration\n");
0320 r100_cp_fini(rdev);
0321 radeon_wb_fini(rdev);
0322 radeon_ib_pool_fini(rdev);
0323 radeon_irq_kms_fini(rdev);
0324 rv370_pcie_gart_fini(rdev);
0325 radeon_agp_fini(rdev);
0326 rdev->accel_working = false;
0327 }
0328 return 0;
0329 }